將中綴表示式轉化成字尾表示式來計算值

2021-10-03 02:59:37 字數 1411 閱讀 4754

題目很簡單,就是給出乙個表示式(例如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.對於運算子 若優先順序大於棧頂運算子時,則把他壓棧 若...