1. 程式人生 > 其它 >資料結構篇_程式設計思想板塊_第二章棧和佇列的應用

資料結構篇_程式設計思想板塊_第二章棧和佇列的應用

  • 程式設計思想板塊最主要的內容是資料結構經典題目及解答題目所需的程式設計思想,願對您能有所幫助

二、棧的應用

  1. 當棧空做退棧運算必定產生空間溢位,稱“下溢”,上溢是一種錯誤應該避免,下溢常用作程式控制轉移的條件

1)括號匹配

1. 演算法思想:

① 初始設定一個空棧,順序讀入括號

② 若是左括號,入棧

③ 若是右括號,與棧頂的左括號相比較,若不匹配直接return

2)表示式求值

  1. 三式中運算元之間的相對次序相同(二叉樹的三種訪問次序中,葉子的相對訪問次序一致),但運算子的相對次序不同

  2. 中綴表示式:我們正常模樣的表示式

  3. 字尾表示式(逆波蘭表示式):此處一般考從中綴轉字尾不能/能轉成什麼樣

① 運算子在運算元後面

② 一箇中綴會轉成多個字尾,故按”左優先計算“原則確定唯一字尾表示式

③ 表示式模樣為<左運算元,右運算元,運算子>

④ 從棧中先彈出的是右運算元

  1. 字首表示式(波蘭表示式):

① 運算子在運算元前面

② 一箇中綴會轉成多個字首,故按”右優先計算“原則確定唯一字尾表示式

③ 表示式模樣為<運算子,左運算元,右運算元>

④ 從棧中先彈出的是左運算元

  1. 中綴表示式計算演算法思想:

① 初始化兩個棧,運算元棧和運算子棧

② 若掃描到運算元,壓入運算元棧

③ 若掃描到運算子或界限符(括號),則按”中綴轉字尾“相同的邏輯壓入運算子棧(期間也會彈出運算子,每當彈出一個運算子時,需要再彈出兩個運算元棧的棧頂元素並執行相應運算,運算結果再壓回運算元棧)

  1. 用棧實現中綴表示式轉字尾表示式:

① 初始化一個棧,用於儲存暫時還不能確定運算順序的運算子。

② 從左到右處理各個元素,直到末尾。可能遇到三種情況:

(1) 遇到運算元。直接加入字尾表示式。

(2) 遇到界限符。遇到“(”直接入棧;遇到“)”則依次彈出棧內運算子並加入字尾表示式,直到彈出“(”為止。注意:“(”不加入字尾表示式。

(3) 遇到運算子。依次彈出棧中優先順序高於或等於當前運算子的所有運算子,並加入字尾表示式,若碰到“(”或棧空則停止。之後再把當前運算子入棧。

③ 按上述方法處理完所有字元後,將棧中剩餘運算子依次彈出,並加入字尾表示式。

  1. 用棧實現字尾表示式的計算:

① 從左往右掃描下一個元素,直到處理完所有元素

② 若掃描到運算元則壓入棧,並回到①;否則執行③

③ 若掃描到運算子,則彈出兩個棧頂元素,執行相應運算,運算結果壓回棧頂,回到①

3)遞迴中應用

  1. 遞迴模型必須滿足兩個條件:

① 遞迴表示式(遞迴體)

② 邊界條件(遞迴出口)


  1. (學會怎麼寫計算過程)

4)迷宮求解

5)進位制轉換

6)棧經典題目的程式設計思想

1. 設有兩個棧s1、s2都採用順序棧方式,並共享一個儲存區[0,...,maxsize-1],為了儘量利用空間,減少溢位的可能,可採用棧頂相向、迎面增長的儲存方式。試設計s1.s2有關入棧和出棧的操作演算法。

演算法思想:

注意:

① 插入和刪除時都要判斷棧是否已滿或已空

7)隊經典題目的程式設計思想

1. 請設計一個佇列,要求滿足:

①初始時佇列為空;

②入隊時,允許增加佇列佔用空間;

③出隊後,出隊元素所佔用的空間可重複使用,即整個佇列所佔用的空間只增不減;④入隊操作和出隊操作的時間複雜度始終保持為O(1)。請回答下列問題:

1) 該佇列是應選擇鏈式儲存結構,還是應選擇順序儲存結構

2) 畫出佇列的初始狀態,並給出判斷隊空和隊滿的條件

3) 畫出第一個元素入隊後的佇列狀態

4) 給出入隊操作和出隊操作的基本過程

演算法思想:

8)棧和佇列應用經典題目的程式設計思想

1.括號匹配題中並沒有大括號可以包括中/小括號這一思想

2. 按下圖所示鐵道進行車廂排程(注意,兩側鐵道均為單向行駛道,火車排程站有一個用

於排程的“棧道”),火車排程站的入口處有n節硬座和軟座車廂(分別用H和S表示)等待排程,試編寫演算法,輸出對這n節車廂進行排程的操作(即入棧或出棧操作)序列,以使所有的軟座車廂都被調整到硬座車廂之前

演算法思想:

兩側的鐵道均為單向行駛道,且兩側不相通。所有車輛都必須通過“棧道”進行排程。演算法的基本設計思想:所有車廂依次前進並逐一檢查,若為硬座車廂則入棧,等待最後排程。檢查完後,所有的硬座車廂已全部入棧道,車道中的車廂均為軟座車廂,此時將棧道的車廂排程出來,調整到軟座車廂之後。

3.

演算法思想:

先將n=0和n=1的情況入棧,把n=0和n=2取除算出n3後再把n3和n2入棧,再重複上述操作用n3,n2算出n4,依次計算最後算出的值即為最終值

4. 某汽車輪渡口,過江渡船每次能載10輛車過江。過江車輛分為客車類和貨車類,上渡船有如下規定:同類車先到先上船;客車先於貨車上船,且每上4輛客車,才允許放上1輛貨車;若等待客車不足4輛,則以貨車代替;若無貨車等待,允許客車都上船。試設計一個演算法模擬渡口管理

演算法思想:

假設陣列q的最大下標為10(類似於雜湊表的思想),恰好是每次載渡的最大量.假設客車的佇列為q1,貨車的佇列為q2.若q1充足,則每取4個q1元素後再取一個q2元素,直到q的長度為10.若q1不充足,則直接用q2補齊

三、佇列應用

  1. 樹的層次遍歷

  2. 圖的廣度遍歷

  3. CPU資源競爭

  4. 印表機與主機速度不匹配

  5. 頁面替換演算法