棧和佇列的應用相關習題及詳解 資料結構

2021-08-10 04:04:12 字數 4421 閱讀 9738

第一題

乙個問題的遞迴演算法求解和其相對應的非遞迴演算法求解()

a.遞迴演算法通常高效一些b.非遞迴演算法通常高效一些

c.兩者相同d.無法比較

第二題

執行()操作時,需要使用佇列作為輔助儲存空間

a.查詢雜湊(雜湊)表b.廣度優先搜尋圖

c.前序(根)遍歷二叉樹d.深度優先搜尋圖

第三題

已知操作符包括『+』『-』『』『/』『(』『)』 。將中綴表示式a+b-a((c+d)/e-f)+g轉化為等價的字尾表示式ab+acd+e/f-*-g+時,用棧來存放暫時還不能確定運算次序的操作符。若棧初始時為空,則轉換過程中同事儲存在棧中的操作符的最大個數是()

a.5b.7

c.8d.11

第四題

假設棧初始為空,將中綴表示式a/b+(c*d-e*f)/g轉化為等價的狗追表示式的過程中,當掃瞄到f時,棧中的元素依次是()

a.+(*-b.+(-*c./+(*-*d./+-*

第一題

通常情況下,遞迴演算法在計算機實際執行的過程中包含很多的重複計算,所以效率會低

第二題

圖的廣度優先搜尋類似於樹的層序遍歷,同樣需要借助於佇列

第三題

考察棧在種豬表示式轉化為字尾表示式中的應用。

將中綴表示式a+b-a*((c+d)/e-f)+g轉換為相應的字尾表示式,需要根據操作符的優先順序來進行棧的變化,我們用icp來表示當前掃瞄到的運算子ch的優先順序,該運算子進棧後的優先順序為isp,則運算子的優先順序如下表所示:

isp)是棧內優先(in stack priority)數,icp是棧外優先(in coming priority)數。

操作符#

(*,/

+,-)

isp015

36icp064

21

我們在表示式後面加上『#』,表示表示式結束,具體換換過程如下:

步驟掃瞄項

項型別動作

棧內內容

輸出isp01

536icp06

4210

#進棧,讀下一符號#1

a運算元

直接輸出#a

2+操作符isp(『#』) < icp(『+』),進棧#+3

b運算元

直接輸出#+b

4-操作符isp(『+』) > icp(『-『),退棧並輸出#+

5isp(『#』) < icp(『-『),進棧#-6

a運算元

直接輸出#-a

7*操作符isp(『-『) < icp(『*』)進棧

#-*8

(操作符

isp(『*』) < icp(『(『),進棧

#-*(9(

操作符isp(『(『) < icp(『(『),進棧

#-*((10c

運算元直接輸出

#-*((c11

+操作符

isp(『(『) < icp(『+』),進棧

#-*((+12d

運算元直接輸出

#-*((+d13

)操作符

isp(『+』) > icp(『)』),退棧並輸出

#-*((+14

isp(『(『) == icp(『)』),直接退棧

#-*(15/

操作符isp(『(『) < icp(『/』),進棧

#-*(/16e

運算元直接輸出

#-*(/e17

-操作符

isp(『/』) > icp(『-『),退棧並輸出

#-*(/18

isp(『(『) < icp(『-『),進棧

#-*(-19f

運算元直接輸出

#-*(-f20

)操作符

isp(『-『) > icp(『)』),退棧並輸出

#-*(-21

isp(『(『) == icp(『)』),直接退棧

#-*22

+操作符

isp(『*』) > icp(『+』),退棧並輸出#-*

23isp(『-『) > icp(『+』),退棧並輸出#-

24isp(『#』) < icp(『+』),進棧

#+25

g運算元

直接輸出#+g

26#操作符isp(『+』) > icp(『#』),退棧並輸出#27

isp(『#』) == icp(『#』),退棧,結束

第四題

將中綴表示式轉換字尾表示式的演算法思想如下:

從左向右開始掃瞄中綴表示式;

遇到數字時,加入字尾表示式;

遇到運算子時:

a.若為『(』,入棧;

b.若為『)』,則一次把棧中的運算子加入字尾表示式中,直到出現『(』,從棧中刪除『(』;

c.若為除括號外的其他運算子,當其優先順序高於除『(』意外的棧頂運算子時,直接入棧。否則從棧頂開始,一次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,直到乙個比它優先順序低的或者遇到了乙個左括號位置。

當掃瞄的中綴表示式結束時,棧中的所有運算子一次出棧加入字尾表示式。

待處理序列

棧字尾表示式

當前掃瞄元素

動作a/b+(c*d-e*f)/g

aa加入字尾表示式

/b+(c*d-e*f)/ga/

/入棧b+(c*d-e*f)/g/a

bb加入字尾表示式

+(c*d-e*f)/g/ab

++優先順序低於棧頂的/,彈出/

+(c*d-e*f)/g

ab/+

+入棧(c*d-e*f)/g

+ab/

((入棧

c*d-e*f)/g

+(ab/

cc加入字尾表示式

*d-e*f)/g

+(ab/c

*棧頂為(,*入棧

d-e*f)/g

+(*ab/c

dd加入字尾表示式

-e*f)/g

+(*ab/cd

--優先順序低於棧頂的,彈出

-e*f)/g

+(ab/cd*

-棧頂為(,-入棧

e*f)/g

+(-ab/cd*

ee加入字尾表示式

*f)/g

+(-ab/cd*e

**優先順序高於棧頂的-,*入棧

f)/g

+(-*

ab/cd*e

ff加入字尾表示式

)/g+(-*

ab/cd*ef

)把棧中(之前的符號加入表示式/g+

ab/cd*ef*-

//優先順序高於棧頂的+,/入棧g+/

ab/cd*ef*-

gg加入字尾表示式

+/ab/cd*ef*-g

掃瞄完畢,運算子一次退棧加入表示式

ab/cd*ef*-g/+完成

由此可知,當掃瞄到f的時候,棧中的元素一次是+(-*,選b。

再次再給出中綴表示式轉換為字首或字尾表示式的手工做法,以上面給出的中綴表示式為例:

第一步:按照運算子的優先順序對所有的運算單位加括號

式子變成了:((a/b)+(((c*d)-(e*f)/g))

第二部:轉換為字首或字尾表示式。

字首:把運算符號移動到對應的括號前面,則變成了:+(/(ab)/(-(*(cd)*(ef))g))

把括號去掉:+/ab/-*cd*efg字首式子出現

字尾:把運算子移動到對應的括號 後面,則變成了:((ab)/(((cd)*(ef)*)-g/)+

把括號去掉:ab/cd*ef*-g/+字尾式子出現

當題目要求直接求字首或字尾表示式時,這種方法會比上一中快捷的多。

棧和佇列的相關面試題(詳解)

include include includeusing namespace std 實現乙個棧,要求實現push 入棧 pop 出棧 min 返回最小值的操作 時間複雜度為o 1 方法一 用兩個棧實現,先同時往s1,和min裡面入第乙個元素,接著s1正常入,同時 min入的時候用s1棧頂相比,如果...

棧和佇列的相關知識

棧和佇列是兩種特殊的線性表 它們的資料元素之間具有順序的邏輯關係,都可以採用順序儲存結構和鏈式儲存結構 線形表的插入和刪除操作不受限制,可以再任意位置進行 棧的插入和刪除操作只允許在表的一端進行 佇列的插入和刪除操作分別在表的兩端進行。棧的特點是後進先出 lifo 佇列的特點是先進先出 fifo 佇...

棧和佇列的綜合應用

迷宮問題。假設迷宮由m行n列構成,有乙個入口和乙個出口,入口座標為 1,1 出口座標為 m,n 試設計並驗證以下演算法 找出一條從入口通往出口的路徑,或報告乙個 無法通過 的資訊。1 用c語言實現順序儲存結構上佇列的基本操作,然後利用該佇列的基本操作找出迷宮的一條最短路徑。2 設計乙個二維陣列maz...