上回說到,隊列是一個先進先出的操作受限的線性表。這一回,我們看到隊列的兩個常見的應用:層次周遊和在計算機系統中的應用。
隊列在層次周遊中的應用
在資訊進行中有一大類問題需要逐層或逐行處理。這類問題的解決方法往往是在處理目前層或目前行時就對下一層或下一行做預處理,把處理順序安排好,待目前層或目前行處理完畢,就可以處理下一層或下一行。使用隊列是為了儲存下一步的處理順序。下面用二叉樹(如圖所示)層次周遊的例子,說明隊列的應用。下表顯示了層次周遊二叉樹的過程。
序 | 說明 | 隊内 | 隊外 |
---|---|---|---|
1 | A 入 | A | |
2 | A 出,BC 入 | BC | A |
3 | B 出,D 入 | CD | AB |
4 | C 出,EF 入 | DEF | ABC |
5 | D 出,G 入 | EFG | ABCD |
6 | E 出,HI 入 | FGHI | ABCDE |
7 | F 出 | GHI | ABCDEF |
8 | GHI 出 | ABCDEFGHI |
該過程簡單描述如下:
- 根結點入隊。
- 若隊空(所有節點都已處理完畢),則結束周遊;否則重複 3 操作。
- 隊列中第一個結點出隊,并通路之。若其有左孩子,則将左孩子入隊;若其有右孩子,則将右孩子入隊,傳回 2。
隊列在計算機系統中的應用
隊列在計算機系統中的應用非常廣泛,以下僅從兩個方面來簡述隊列在計算機系統中的作用:第一個方面是解決主機與外部裝置之間速度不比對的的問題,第二個方面是解決由多使用者引起的資源競争問題。
對于第一個方面,僅以主機和列印機之間速度不比對的問題為例作簡要說明。主機輸出資料給列印機列印,輸出資料的速度比列印資料的速度要快得多,由于速度不比對,若直接把輸出的資料送給列印機列印顯然是不行的。解決的辦法是設定一個列印資料緩沖區,主機把要列印輸出的資料依次寫入緩沖區,寫滿後就暫停輸出,轉去做其他的事情。列印機就從緩沖區中按照先進先出的原則依次取出資料并列印,列印完後再向主機送出請求。主機接到請求後再向緩沖區寫入列印資料。這樣做既保證了列印資料的正确,又使主機提高了效率。由此可見,列印資料緩沖區中所存儲的資料就是一個隊列。
對于第二個方面,CPU(即中央處理器,它包括運算器和控制器)資源的競争就是一個典型的例子。在一台帶有多終端的計算機系統上,有多個使用者需要 CPU 各自運作自己的程式,他們分别通過各自的終端向作業系統提出占用 CPU 的請求。作業系統通常按照每個請求在時間上的先後順序,把它們排成一個隊列,每次把 CPU 配置設定給隊首請求的使用者使用。當相應的程式運作結束或用完規定的時間間隔後,令其出隊,再把 CPU 配置設定給新的隊首請求的使用者使用。這樣既能滿足每個使用者的請求,又使 CPU 能夠正常運作。
總結
關于隊列的應用就說到這裡,下一回我們看一種大家都非常熟悉的資料結構——數組!
當然,我從今年開始已經入駐 B 站了!下面給出 B 站賬号:新時代的運籌帷幄,喜歡的可以關注一下,看完視訊不要忘記一鍵三連啊!