資料結構 棧 雜記

2021-07-31 09:16:49 字數 2606 閱讀 8955

字首、中綴、字尾表示式

舉例:

(3 + 4) × 5 - 6 就是中綴表示式

-× + 345

6 字首表示式

3 4 + 5 × 6 - 字尾表示式

中綴表示式(中綴記法)

中綴表示式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處於運算元的中間。中綴表示式是人們常用的算術表示方法。

雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,然後再進行求值。對計算機來說,計算字首或字尾表示式的值非常簡單。

字首表示式(字首記法、波蘭式)

字首表示式的運算子位於運算元之前。

字首表示式的計算機求值:

從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧;重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果。

例如字首表示式「- × + 3 4 5 6」:

(1) 從右至左掃瞄,將6、5、4、3壓入堆疊;

(2) 遇到+運算子,因此彈出3和4(3為棧頂元素,4為次頂元素,注意與字尾表示式做比較),計算出3+4的值,得7,再將7入棧;

(3) 接下來是×運算子,因此彈出7和5,計算出7×5=35,將35入棧;

(4) 最後是-運算子,計算出35-6的值,即29,由此得出最終結果。

可以看出,用計算機計算字首表示式的值是很容易的。

字尾表示式(字尾記法、逆波蘭式)

字尾表示式與字首表示式類似,只是運算子位於運算元之後。

字尾表示式的計算機求值:

與字首表示式類似,只是順序是從左至右:

從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(次頂元素 op 棧頂元素),並將結果入棧;重複上述過程直到表示式最右端,最後運算得出的值即為表示式的結果。

例如字尾表示式「3 4 + 5 × 6 -」:

(1) 從左至右掃瞄,將3和4壓入堆疊;

(2) 遇到+運算子,因此彈出4和3(4為棧頂元素,3為次頂元素,注意與字首表示式做比較),計算出3+4的值,得7,再將7入棧;

(3) 將5入棧;

(4) 接下來是×運算子,因此彈出5和7,計算出7×5=35,將35入棧;

(5) 將6入棧;

(6) 最後是-運算子,計算出35-6的值,即29,由此得出最終結果。

2.存在多少種可能的出棧序列

3.中綴表示式計算機求值

一、準備兩個棧:運算元棧s1,運算子棧s2。

二、從【左至右】掃瞄表示式:3*2^(4+2*2-6*3)-5;

遵循的原則是: 遇到運算元入s1棧;若遇到運算子c,則需要與s2的棧頂 字元c2進行優先順序比較;

《1》若c > c2,則c入棧;

《2》若c < c2,則c2退棧,並將s1棧頂的兩個元素退棧與操作符一起運算,將結果入s1棧;

(1)運算元3,入棧s1;

(2)運算子*,入棧s2;

(3)運算元2,入棧s1;

(4)運算子^ ,入棧s2;(理由是:^的優先順序 高於 *的優先順序)

(5)運算子(,直接入s2;

(6)運算元4,入棧s1;

(7)運算子+,入棧s2;(理由是:( 後面的運算子直接入棧)

(8)…數2,入棧s1;

(9)…符,入棧s2;(理由是:的優先順序 高於 +的優先順序)

(10)…數2,入棧s1;

(11)…符 -,(由於 -的優先順序低於)s2的棧頂字元 出棧,並完成2*2=4的運算,將結果4存入s1中;—s1:3,2,4,4;

(由於 -的優先順序低於+)s2的棧頂字元+出棧,並完成4+4=8的運算,將結果8存入s1中;—s1:3,2,8;

此時,- 成為了(後的運算子,則直接入棧s2;—s2:*^(-;

(12)…數6;

4.而中序遍歷檢索二叉樹時,由於其儲存結構跟遍歷順序相符,因此不需要用堆疊。

檢索二叉樹 增加了指向前驅結點和指向後繼節點的標誌,因此在遍歷時無需用棧

5.遞迴工作棧裡面包括返回位址、本層的區域性變數和遞迴呼叫的形參代換用實參,所以正常情況下,無論遞迴過程有沒有使用區域性變數,轉換為非遞迴過程都需要用棧來模擬這個遞迴呼叫過程

當然,有一些特殊遞迴不用棧就可以直接轉換,比如尾遞迴、常係數遞推等,無論是否有區域性變數

6.前序遍歷(中左右)、中序遍歷(左中右)的最後訪問的節點都是左或右葉節點,

葉節點是沒有子樹的,所以兩個指標域空出來了,可以存放線索指標用於回溯。但是後續遍歷(左右中),最後訪問的是子樹的根節點,子樹根節點的兩個指標域都指向子樹了,所以不能空出來存放線索資訊,只能借助棧儲存。

資料結構 雜記

1.哈爾夫曼樹 2.前序遍歷 根 左 右 1.訪問根節點 2.前序遍歷左子樹 3.前序遍歷右子樹 中序遍歷 左 根 右 1.中序遍歷左子樹 2.訪問根節點 3.中序遍歷右子樹 後序遍歷 左 右 根 1.後序遍歷左子樹 2.後序遍歷右子樹 3.訪問根節點 3.廣義表最基本的操作 取表頭head ls ...

資料結構 雜記 選擇排序

include include int main if pi int malloc sizeof int null sprintf stderr,insufficient memory pi int malloc sizeof int 先介紹關於數值交換 void swap int a,int b ...

資料結構 棧 棧

可以把棧想像成乙個桶 進棧 就是把和桶口一樣大的燒餅往桶裡面扔 出棧 就是把燒餅拿出來 特點 先進後出。先扔進去的燒餅最後才能拿出來,最後扔進去的燒餅,第乙個拿出來 剛開始top 1 top 1 然後把進棧的元素賦值給data top 入棧操作 void push stack s,int x els...