第一題
乙個問題的遞迴演算法求解和其相對應的非遞迴演算法求解()
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...