題目很簡單,就是給出乙個表示式(例如2*(3+5)+6),然後我們得出他的值。
未接觸這個方法前,我是用了一種很複雜的方法(爆肝警告)
將中綴表示式(就是我們要求的表示式)轉化成字尾表示式來解決就會比較簡單。
對於中綴表示式和字尾表示式的概念這裡就不說了,只將方法呈現出來。
例如乙個中綴表示式:a+(b-c/d)✖e,是如何將其轉化成字尾表示式:abcd/-e✖+的?(忽略乘號的特殊)
直接介紹下方法,對這個中綴表示式依次進行掃瞄,如果是數字,則直接存入放字尾表示式的陣列中;如果是符號,先與存符號的棧頂符號進行比較,若優先順序較大則進棧,若小於或等於則棧頂出棧到字尾表示式的陣列,此字元繼續與現在的棧頂比較,進行迴圈操作;如果讀到左括號,則左括號直接進棧;如果讀到右括號,則符號依次退棧直到遇到左括號,左括號哪項也退棧,但不存入字尾表示式。
對字尾表示式計算就是依次掃瞄,掃瞄到符號,則符號前的兩個數進行符號運算,直到掃瞄完。
接下來直接上**
#include
#include
#define maxn 1005000
char s[maxn]
;//存中綴表示式
char s1[maxn]
;//存字尾表示式的符號
char s2[maxn]
;//存符號的棧
int a[maxn]
;//存字尾表示式中的數字
int b[maxn]
;//用來計算最後的值
intjudge
(char op1,
char op2)
else
if(op1==
'(')
return0;
else
return1;
}int
main()
if(isdigit
(s[i]))
else
if(s[i]
=='('
) s2[
++top]
=s[i]
;//左括號直接入棧
else
if(s[i]
==')'
)else
if(s[i]
=='='
)else
s2[++top]
=s[i]
;//入棧}}
}for
(i=0
;i<=count;i++)}
printf
("%d"
,b[top]);
//完成
}
歡迎巨佬們指正 將中綴表示式轉化成字尾表示式
中綴變字尾主要的思想就是將需要的運算子先做乙個對映 對於任意表示式,式中從頭開始掃,遇到非運算子,即任意數字或字母直接輸出 遇到運算子考慮放入棧中 若棧空則放入 若棧不為空,判斷棧頂的優先順序是否 待放入的運算子,若 小於則將其壓入棧中 若不小於,則將棧一直 pop,知道運算子可以放入棧中 當然還有...
將中綴表示式轉化成字尾表示式(逆波蘭式)
直接上 中綴表示式 轉換成 字尾表示式 逆波蘭式 include include struct stack int get priority char c int isempty struct stack s struct stack createstack unsigned int len voi...
一文看懂中綴表示式轉化成字尾表示式
通過堆疊的學習,我們已經知道想要將中綴表示式轉化成字尾表示式,有以下幾步操作 1.對於運算數 直接輸出 2.對於左括號 直接壓入棧中 3.對於右括號 將棧頂的運算子彈出並輸出,若棧頂元素不是左括號,繼續彈出,直到遇到左括號 出棧,但是不輸出 4.對於運算子 若優先順序大於棧頂運算子時,則把他壓棧 若...