棧在表示式求值中的應用

2021-10-05 02:34:11 字數 2092 閱讀 6289

中綴表示式轉字尾表示式

初始化乙個棧,用來儲存暫還不能確定運算順序的運算子

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

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

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

例子

a+b*(c-d)-e/f --> abcd-*+ef/-

detail

stack: null suffixstr: a (掃瞄到a)

stack: + suffixstr: a (掃瞄到+)

stack: + suffixstr: ab (掃瞄到b)

stack: +* suffixstr: ab (掃瞄到*)

stack: +*( suffixstr: ab (掃瞄到"(")

stack: +*( suffixstr: abc (掃瞄到c)

stack: +*(- suffixstr: abc (掃瞄到-)

stack: +*(- suffixstr: abcd (掃瞄到d)

stack: +* suffixstr: abcd- (掃瞄到")")

stack: - suffixstr: abcd-*+ (掃瞄到-)

stack: - suffixstr: abcd-*+e (掃瞄到e)

stack: -/ suffixstr: abcd-*+e (掃瞄到/)

stack: -/ suffixstr: abcd-*+ef (掃瞄到f)

stack: null suffixstr: abcd-*+ef/- (掃瞄到null)

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

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

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

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

中綴表示式的計算

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

若掃瞄到運算元壓入運算元棧

若掃瞄到運算子或界限符,則按照 「中綴轉字尾」 相同的邏輯壓入運算子棧(期間也可以彈出運算子,每當彈出乙個運算子時,就需要再彈出兩個運算元棧的棧頂元素並執行相應運算,運算結果再壓回運算元棧)

其實就是 中綴轉字尾 + 字尾表示式求值,兩個演算法的結合

例運算元棧:numstack;運算子棧:opstack

a + b - c * d / e + f

detail

numstack: a opstack: null (掃瞄到a)

numstack: a opstack: + (掃瞄到+)

numstack: ab opstack: + (掃瞄到b)

numstack: r opstack: - (掃瞄到-,r=a+b)

numstack: rc opstack: - (掃瞄到c)

numstack: rc opstack: -* (掃瞄到*)

numstack: rcd opstack: -* (掃瞄到d)

numstack: rk opstack: -/ (掃瞄到/,k=c*d)

numstack: rke opstack: -/ (掃瞄到e)

numstack: h opstack: + (掃瞄到+,g=k/e,h=r-g)

numstack: hf opstack: + (掃瞄到f)

numstack: z opstack: null (掃瞄到null, z=h+f)

注意:先彈出的是,右運算元!!

棧在表示式求值中的應用

一 中綴表示式轉字尾表示式 從左到右處理各個元素 1.遇到運算元。直接加入字尾表示式 2.遇到界限符。遇到 直接入棧,遇到 則依次彈出棧內運算子並加入字尾表示式,直到彈出 為止。注意 不加入字尾表示式。3.遇到運算子。依次彈出棧中優先順序高於或等於當前運算子的所有運算子,並加入字尾表示式,若碰到 或...

棧應用 表示式求值

include stdafx.h include using namespace std const int explenght 20 const int stack init size 20 const int stack incrment 10 templateclass stack stack...

棧應用 表示式求值

include include define length 100 初始分配棧的長度 define add len 10 棧長增量 typedef struct 定義字元棧 sqstack void initstack sqstack s 初始化乙個棧 void push sqstack s,int...