數據結構期末復習(二)
數據結構復習(二)
後綴表達式求值
過程:
- 遍歷表達式,遇到數字入棧
- 遇到操作數,彈出最上面的兩個元素,執行操作,操作完後結果再入棧
- 一直讀完,將最後的結果輸出
例子:
32 26 - 5 * 28 4 / +
32-26=6
6*5=30
28/4=7
30+7=37
結果就是37
中綴表達式轉後綴表達式
下面規則用來理解轉換過程,理解掃描過程棧變化的情況。
中綴表達式a + bc + (d e + f) * g,其轉換成後綴表達式則為a b c * + d e * f + g * +。
轉換過程需要用到棧,具體過程如下:
1)如果遇到操作數,我們就直接將其輸出。
2)如果遇到操作符,則我們將其放入到棧中,遇到左括號時我們也將其放入棧中。
3)如果遇到一個右括號,則將棧元素彈出,將彈出的操作符輸出直到遇到左括號為止。註意,左括號只彈出並不輸出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,從棧中彈出元素直到遇到發現更低優先級的元素(或者棧為空)為止。彈出完這些元素後,才將遇到的操作符壓入到棧中。有一點需要註意,只有在遇到" ) "的情況下我們才彈出" ( ",其他情況我們都不會彈出" ( "。
5)如果我們讀到了輸入的末尾,則將棧中所有元素依次彈出。
靜態鏈表
靜態鏈表是用數組來模擬存儲空間實現鏈表的。
分為head鏈和avail鏈,head鏈存儲的是具體數據,而avail鏈存儲的是可利用空間。
讀一下:
‘C‘、‘B‘、‘A‘
如果要添加數據,就要從可以用空間開始添加,刪除的修改avail指針就可以了,不需要把值改掉。
循環隊列
//循環隊列判空條件:
rear==front;
//循環隊列判滿條件:
(rear+1)%maxSize == front;
//求循環隊列的長度:
(rear-front+maxSize)%maxSize;
//遍歷循環隊列
for(i=front;i!=rear;i=(i+1)%maxSize)
棧、隊列和遞歸單元 - 易錯題
判斷題
- 棧是操作受限的線性表,它只允許在表頭插入和刪除元素。(x)- 棧只允許在表尾插入和刪除元素,所以錯。
- 只有使用了局部變量的遞歸過程在轉換成非遞歸過程時,才必須使用棧。 (x) - 是否必須使用棧和局部變量存在與否無關,尾遞歸形式可以不用棧模擬,而遞歸過程中函數的調用取地址等操作必須由棧模擬(除尾遞歸等特殊情況)。
填空題
有n個數入棧,則出棧的順序有C(2n,n)-C(2n,n-1)種;卡特蘭數的定義:
令h(0)=1,h(1)=1,Catalan數滿足遞歸式:h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2),
在雙端隊列中,元素進入該隊列的順序依次為a,b,c,d,則既不能由輸入受限的雙端隊列得到,又不能由輸出受限的雙端隊列得到的輸出序列是dbca;分析:輸入受限的雙端隊列可以看成是一個隊列和一個棧的組合,因此如果隊列和棧都無法輸出的元素在輸入受限的雙端隊列中同樣無法輸出。而我們知道,棧可以輸出的組合個數為C(8,4)-C(8,3) = 14種,隊列能輸出的組合個數為1種,四個元素排列有A(4,4)=24種,24-14-1=9種,所以兩種結構都不能輸出的組合數共有9種。只考慮棧不能輸出的組合,因為數目小。分別為adbc,bdac,cabd,cadb,dabc,dacb,dbac,dbca,dcab,在這幾個序列裏面找輸出受限的隊列不能輸出的序列,就很容易找到dbca了。
數據結構期末復習(二)