不過目前這個功能太少,而且能算的十分有限,
測試輸入為
4+4*5+3=
測試輸出為
4 4 5 * + 3 +=27
主要就是瞭解一下怎麼把中綴運算式轉化成尾碼運算式,然後再利用尾碼運算式求值,我後續會完善這個程式,做個真正意義上的計算機。。o(∩_∩)o
轉化步驟我搜尋了一下,大致如下:
將中綴運算式轉換為等價的尾碼運算式的過程要使用一個棧放“(”,具體可以按照下面的方式進行。
(1)從左至右依次掃描中綴運算式的每一個字元,如果是數字字元和圓點“.”則直接將它們寫入尾碼運算式中。
(2)如果遇到的是開括弧“(”,則將它們壓入一個操作符棧(不需要與棧頂操作符相比較),它表明一個新的計算層次的開始,在遇到和它匹配的閉括弧“)”時,將棧中的元素彈出來並放入尾碼運算式中,直到棧頂元素為“(”時,將棧頂元素“(”彈出(不需要加入尾碼運算式),表明這一層括弧內的操作處理完畢。
(3)如果遇到的是操作符,則將該操作符和操作符棧頂元素比較:
1、當所遇到的操作符的優先順序小於或等於棧頂元素的優先順序時,則取 出棧頂元素放入尾碼運算式,並彈出該棧頂元素,反覆執行直到當前操作符的優先順序大於棧頂元素的優先順序小於;
2、當所遇到的操作符的優先順序大於棧頂元素的優先順序的時則將它壓入棧中。
(4)重複上述步驟直到遇到中綴運算式的結束符標記“#”,彈出棧中的所有元素並放入尾碼運算式中,轉換結束
#include<iostream>#include "stack.h"#include "deque.h"bool order[48][48];void initial();void judge(char);bool issym(char);int calculate();deque<char>expression;stack<char>symbol;stack<int>number;int main(){initial();using namespace std;char ch;while (cin>>ch && ch!='@'){if(ch=='='){while (!symbol.empty()){expression.push_back(symbol.top());symbol.pop();}expression.show();cout<<"="<<calculate()<<endl;while(!symbol.empty())symbol.pop();while(!expression.empty())expression.pop_back();continue;}if(issym(ch))judge(ch);else {expression.push_back(ch);number.push(ch-'0');}}return 0;}void initial(){order['+']['+']=order['-']['-']=order['*']['*']=order['/']['/']=true;order['*']['+']=order['*']['-']=order['*']['/']=true;order['/']['+']=order['/']['-']=order['/']['*']=true;order['+']['*']=order['+']['/']=false,order['+']['-']=true;order['-']['*']=order['-']['/']=false,order['-']['+']=true;}void judge(char s){if(symbol.empty())symbol.push(s);else{if(order[s][symbol.top()])symbol.push(s);else {while(!symbol.empty() && order[symbol.top()][s]){expression.push_back(symbol.top());symbol.pop();}symbol.push(s);}}}bool issym(char s){if(s=='+' || s=='-' || s=='*' || s=='/')return true;return false;}int calculate(){stack<int>num;stack<char>exp;while(!expression.empty()){char ch=expression.front();expression.pop_front();if(issym(ch)){int a=num.top();num.pop();int b=num.top();num.pop();switch(ch){case '+':num.push(a+b);break;case '-':num.push(a-b);break;case '*':num.push(a*b);break;case '/':num.push(a/b);break;}}elsenum.push(ch-'0');}return num.top();}