基於棧的字尾算術表示式求值

2021-10-01 14:21:10 字數 1515 閱讀 7631

(這是乙個菜雞的19秋季學期資料結構實驗課) 基於棧的字尾算術表示式求值

【實驗目的】

1.掌握中綴表示式轉換為字尾表示式的演算法。

2.掌握字尾表示式求值的演算法。

【實驗內容】

問題描述

輸入乙個中綴算術表示式,將其轉換為字尾表示式,然後對字尾表示式進行求值。運算子包括「+」、「-」、"*"、「/"、「=」,參與運算的為小於10的自然數(只考慮二元運算即可。

輸入要求

多組資料,每組資料一行,對應乙個算術表示式,每個表示式均以「=」結尾。當表示式只有乙個「=」時,輸入結東。

輸出要求

對於每組資料輸出2行,第1行為中綴表示式對應的字尾式,第2行為字尾式求值的結果。

輸入樣例

9+(3-1)*3+1/2=

1+2=

輸出樣例

931-3*+12/+

1512+

3【實驗提示】

首先借助乙個運算子棧將中綴表示式轉換為字尾表示式,然後再借助乙個運算數棧對字尾表示式求值。中綴表示式轉換為字尾表示式的演算法思路附後。

對轉換後得到的字尾表示式進行計算的具體步驟如下:

借助乙個工作棧opnd,用以寄存運算元或運算結果。從左到右掃瞄字尾表示式。讀入第乙個字元ch。若ch不是運算子,則壓入opnd棧,讀入下一字元;若是運算子,則從opnd中依次彈出兩個數分別到y和x,然後以」x ch y「的形式計算出結果,將結果壓 opnd棧中。如果字尾表示式未讀完,重複執行上面過程,最後opnd棧頂元素即為表示式的求值結果,返回此元素

#include

#include

#include

#include

#include

#include

using namespace std;

intpre

(char c)

//優先順序判斷

intcalculate

(int a,

int b,

char ch)

//運算

}int

main()

else

op.pop();

}elseif(

pre(s[i]

)<=

pre(op.

top())

)//總是彈出優先順序大的

op.push

(s[i]);

}elseif(

pre(s[i]

)>

pre(op.

top())

)}}while

(!op.

empty()

)//將棧中剩下的字元儲存到a中

int n=0;

while

(t--

)//輸出

cout

)//計算

else

r++;}

cout

)

pop();

}}

基於棧的中綴算術表示式求值

實驗目的 1.掌握棧的基本操作演算法的實現,包括棧初始化 進棧 出棧 取棧頂元素等。2.掌握利用棧實現中綴表示式求值的演算法。實驗內容 問題描述 輸入乙個中綴算術表示式,求解表示式的值。運算子包括 參加運算的數為 double型別且為正數。要求 直接使用中綴算術表示式進行計算,不能轉換為字尾或字首表...

基於棧的中綴算術表示式求值

include include include include using namespace std typedef struct stacknode lstack 兩個棧,乙個是字元,乙個是數字,先判斷是什麼字元,然後呼叫不同的函式 typedef struct data struct stac...

棧的應用 算術表示式求值

選擇棧作為資料結構,所以所有操作都要圍繞棧的特點來進行。因為先入棧而被壓在下面的意味著要後處理,所以優先順序低的不能壓著優先順序高的而入棧。對於同級的操作符,因為要按照從左往右的運算規則,所以也不 能壓著同級的操作符而入棧。簡單來說,與棧頂的操作符比較,優先順序高的則入棧,否則操作符出棧作相應運 算...