中綴表示式是正常的表示式形式,
例如:4.99 * 1.06 + 5.99 + 6.99 * 1.06
字尾表示式是針對中綴表示式而言的,可以理解為:操作符在兩個運算元之後。
例如:4.99 1.06 * 5.99 + 6.99 1.06 * +
表示式的求值規則為:
設兩個棧,n,o,分別儲存運算元和操作符。
從左到右掃瞄中綴表示式:
遇到乙個運算元,將其壓入棧n中;
遇到操作符:(第乙個直接入棧n)
1.o棧頂元素優先順序小於當前掃瞄操作符:當前操作符壓入棧o。
2.o棧頂元素優先順序大於等於當前掃瞄操作符:取o棧頂操作符和棧n兩個元素,計算得到結果再壓入棧n,迴圈直到o棧頂元素優先順序小於當前操作符,執行第1條。
遍歷完表示式後,要把棧o中操作符全部計算完,此時的棧頂元素即為計算結果。
4.99 * 1.06 + 5.99 + 6.99 * 1.06
如上的表示式求值過程為:
初始,棧空;
①遇到運算元4.99,入棧n;
②遇到操作符*,第乙個直接入棧o;
③遇到運算元1.06,入棧n;
④遇到操作符+,o棧頂操作符優先順序高於當前操作符,彈出n棧中兩個數(1.06和4.99),並將1.06×4.99的結果5.2894壓入棧n,且彈出o棧頂元素「 * 」,此時o棧頂沒有比「+」操作符更高優先順序的元素,故不用迴圈比較,直接將「+」壓入棧o;
⑤遇到運算元5.99,入棧n;
⑥遇到操作符+,與棧頂元素優先順序相同,故計算5.2894+5.99的值11.2794壓入棧n,操作同上⑤,直接講「+」壓入棧o;
⑦遇到運算元6.99,入棧;
⑧遇到操作符*,比o棧頂元素優先順序高,直接入棧o;
⑨遇到運算元1.06,入棧;
⑩此時棧o不為空,應從o棧頂元素「 * 」開始計算,將1.066.99的結果7.4094壓入棧n,彈出「」。
⑪此時棧o仍不為空,元素為「+」,將7.4094+11.2794的結果18.6888壓入棧n;
最後o棧為空,結果即為n棧頂元素——18.6888。
(如果還是有點抽象可以畫個圖理解一下)
hdoj-1237 簡單計算器
problem description
讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
input
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
output
對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
sample input
1 + 2
4 + 2 * 5 - 7 / 11
0sample output
3.00
13.36
#include.h>
using namespace std;
const
int maxn =
300;
stack<
double
>
n;stack<
char
>
o;char s[maxn]
;int
priority
(char op)
void
ope(stack<
char
>
&o, stack<
double
>
&n)double
cal(
) i--
; n.
push
(temp);}
else
o.push
(s[i]);
}}return n.
top();
}int
main()
while
(!o.
empty()
)printf
("%.2lf\n"
,cal()
);}}
棧應用 表示式求值
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...
表示式求值 棧的應用
表示式求值 西西設計的機械人卡多掌握了加減法運算以後,最近又學會了一些簡單的函式求值,比如,它 知道函式min 20,23 的值是20 add 10,98 的值是108等等。經過訓練,西西設計的機械人卡多 甚至會計算一種巢狀的更複雜的表示式。假設表示式可以簡單定義為 1.乙個正的十進位制數 x 是乙...