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 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧...