棧和佇列的思想應用
阿新 • • 發佈:2019-01-06
棧和佇列的應用
在日常生活中,很多問題可以歸結到棧和佇列的應用問題。例如,排隊購物的現象就可以看做是佇列。在計算機學科的應用中,棧和佇列的應用就更多了,例如,編譯系統、訊息佇列等。
棧的應用
棧具有相當廣泛的實際應用,例如,可以顛倒資料串的次序、為回溯演算法提供支援、實現自動機等。
1.編譯應用
棧可以應用於括號匹配、行編輯器、表示式求值、演算法優先文法等編譯程式中。例如,在表示式中,一般存在大、中、小三種括號,分別定義為“{}”、“[]”和“()”,要求其只能自我匹配,不能互動匹配,比如“{[()]}”、“[()()()]”等均為正確匹配,而“({]”、“(])[”、“)(]}”等均為錯誤匹配。使用棧檢測括號是否匹配的演算法描述如下:
2.轉置應用
一串資料全部進入棧後再全部出棧,將得到一個次序完全相反的資料串,這是棧的特性之一。因此,棧可以應用於轉置操作,例如,數的進位制轉換等。
例子:已知線性連結串列L,請按從表尾到表頭的順序輸出元素。
【解析】從頭到尾遍歷連結串列,同時將連結串列元素入棧,再依次出棧,並列印元素資訊即可。其演算法描述如下:
3.迷宮問題
迷宮問題是指在迷宮中從入口尋找出口的問題。此類問題的本質是將迷宮建模成圖,將迷宮中的點建模為圖中的點,將迷宮中相連並且相通的兩點建模為圖中的一條邊,一般採用矩陣方式儲存圖,這樣迷宮求解就轉化為圖的遍歷,採用回溯法窮舉所有從入口點到出口點之間的路徑即可。
迷宮問題求解演算法中一般使用一個棧來儲存訪問過的頂點資訊,棧中元素(即頂點資訊)由頂點位置和搜尋方向兩部分組成,前者記載該頂點在迷宮中的位置,後者記載下一個頂點的訪問方向,例如,右、下、左、上四個相連的方向,程式設計時可分別使用列舉型別enum表示。
佇列的應用
佇列是一種相當實用的資料結構,可應用於生產、生活的各個方面,例如,共享印表機、訊息佇列和廣度優先搜尋等。
1.共享印表機
目前,印表機提供的網路共享列印功能採用了緩衝池技術,佇列就是實現這個緩衝技術的資料結構支援。每臺印表機具有一個佇列(緩衝池),使用者提交列印請求被寫入到佇列尾,當印表機空閒時,系統讀取佇列中第一個請求,列印並刪除之。這樣,利用佇列的先進先出特性,就可完成印表機網路共享的先來先服務功能。
2.訊息佇列
作業系統中的訊息佇列也是佇列的應用之一,訊息佇列遵循先進先出的原則,如圖2-5所示,傳送程序將訊息寫入佇列尾,接收程序則從佇列頭讀取訊息。