中綴表示式變字首表示式(波蘭式)並求值

2021-08-16 17:01:21 字數 2248 閱讀 4123

1.先介紹一種簡單的數學小技巧,可以快速寫出乙個算式的字首表示式

eg:1+2-3*(4-5)

我們只需要在正確的計算順序上加上適當的輔助括號,再把運算符號提到相應的括號外,就可以方便地得到字首表示式了

具體操作如下:((1+2)-(3*(4-5)))    把符號提到括號外:-(+(1 2)*(3-(4 5)))

最後去掉輔助括號,就得到了相應的字首表示式:- + 1 2 * 3 - 4  5【這個方法也適合字尾表示式哦】

2.上面只是簡單的數學小技巧,下面就要真刀真槍地從演算法的角度(用棧的方法實現)實現了

大致思路:定義兩個棧,乙個符號棧存運算子,乙個數字棧存數字和處理後的字元,將算式從後往前讀入棧中。

講解以算式:1+2-3*(4-5)為例

其實,中綴表示式轉字首表示式只需要注意以下四點,問題就迎刃而解:

當符號棧為空的時候,符號直接放入符號棧中

符號棧中元素:)

數字棧中元素:5

當符號棧中有元素時,

(1)若符號棧中元素是')',可以直接入符號棧

符號棧中元素:) -

數字棧中元素:5 4

(2)若將要入符號棧的是'(',說明括號裡的內容輸入完了,此時可以把')』和'('之間的所有符號出符號棧進數字棧

符號棧中元素:         【括號不是實際符號,處理掉】

數字棧中元素:5 4 -

接下來按照原理:

符號棧中元素:*

數字棧中元素:5 4 - 3

(3)若將要入棧的符號運算優先順序比符號棧棧頂符號的優先順序低,則將棧頂元素出符號棧入數字棧,直到將入棧的符號優先順序不再比符號棧優先順序低【優先順序可以相同】,再把將要入棧的符號入符號棧【  ')』比較例外,不用比較優先順序,直接進符號棧】

符號棧中元素:-

數字棧中元素:5 4 - 3 *

接下來按照原理:

符號棧中元素:- +

數字棧中元素:5 4 - 3 2 1

最後一步,把符號棧剩餘符號全部入數字棧5 4 - 3 * 2 1 + -

出棧後,就得到了完整的字首表示式:- + 1 2 * 3 - 4  5

3.求值問題

求值問題相對簡單,因為把算式轉化為字首表示式就是為了方便求值的嘛

我們觀察這個字首表示式:- + 1 2 * 3 - 4  5

只要從後往前,兩個運算元兩個運算元地運算【運算子用最接近兩數的運算子】,就能得到算式值了

即:4-5=-1 ,3*(-1)=-3, 1+2=3 ,3-(-3)=6

具體**如下:

#include

#include

#include

#include

#include

using namespace std;

void caozuo(stack&s, stack&t)

s.pop();//把右括號pop掉

}void caozuo2(char temp, stack&t)

}int main()

s1.push(temp);}}

}else if (temp == '*')

else

len++;

s2.push(' ');}}

while (!s1.empty())

string c1;

while (!s2.empty())

//cout << endl;

//cout << c1 << endl;

string ctemp = c1;

stackc2temp;

//cout << ctemp<< endl;

for (int i = ctemp.length() - 1;i >0;i--)

else c2temp.push(ctemp[i]);

}printf("case %d:\n", num++);

c2temp.push(ctemp[0]);

if(c2temp.top()==' ')c2temp.pop();//"11"單獨數字也是算式

while (!c2temp.empty())

cout << endl;

stackc2;

int i = c1.length();

while (i)

i++;

c2.push(x);

}else caozuo2(c1[i], c2);

}cout << c2.top() << endl;}}

第一次寫部落格,有錯誤或不足之處還請諒解

字首 中綴 字尾表示式 逆波蘭表示式

遇到 運算子,因此彈出3和4 3為棧頂元素,4為次頂元素,注意與字尾表示式做比較 計算出3 4的值,得7,再將7入棧 接下來是 運算子,因此彈出7和5,計算出7 5 35,將35入棧 最後是 運算子,計算出35 6的值,即29,由此得出最終結果 從右至左掃瞄中綴表示式 遇到運算元時,將其壓入s2 遇...

字首 中綴 字尾表示式 逆波蘭表示式

字首表示式 中綴表示式 字尾表示式都是四則運算的表達方式,用以四則運算表示式求值 即數學表示式的求職 中綴表示式就是常見的運算表示式,如 3 4 5 6 字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前 比如 3 4 5 6 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧...

字首 中綴 字尾表示式 逆波蘭表示式

字首表示式 中綴表示式 字尾表示式都是四則運算的表達方式,用以四則運算表示式求值,即數學表示式的求值。中綴表示式就是常見的運算表示式,如 3 4 5 6 字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前 比如 3 4 5 6 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧...