後綴表達式做計算器程序
概念:
後綴表達式是相較於中綴表達式而言的,像我們平時寫的2+3*(4-(5+6))/7就是一個中綴表達式,那麽如何將之變為後綴表達式呢?後綴表達式如何用來求解呢?
先來第一個問題(中綴->後綴):
變為後綴表達式方法(規則):
1.遇到操作數:直接添加到後綴表達式中
2.棧為空時,遇到運算符,直接入棧
3.遇到左括號:將其入棧
4.遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。
5.遇到其他運算符:加減乘除:彈出所有優先級大於或者等於該運算符的棧頂元素,然後將該運算符入棧。
6.最終將棧中的元素依次出棧,輸出。
用一個實例來分析:
X = 2+3*(4-(5+6))/7
1、遇到操作數2,添加到後綴表達式中 2 (此時的後綴表達式,下同)
2、棧為空,遇到加號‘+’,將‘+’入棧 2
3、遇到操作數3,添加到後綴表達式中 23
4、遇到操作符‘*’,棧頂為‘+’,‘*’優先級大於‘-’,不出棧,‘*’入棧 23
5、遇到左括號‘(’,直接入棧。 23
6、遇到操作數4,添加到後綴表達式中 234
7、遇到減號‘-’,棧頂為‘(’,‘-’入棧 234
8、遇到左括號‘(’,直接入棧。 234
9、遇到操作數5,添加到後綴表達式中 2345
10、遇到加號‘+’,棧頂為‘(’, ‘+’入棧 2345
11、遇到操作數6,添加到後綴表達式中 23456
12、遇到右括號‘)’(不入棧),出棧‘+’,出棧‘(’(不添加到後綴表達式中) 23456+
13、遇到右括號‘)’(不入棧),出棧‘-’,出棧‘(’(不添加到後綴表達式中) 23456+-
14、遇到‘/’,棧頂為‘*’, ‘/’優先級大於‘*’,將‘*’出棧 23456+-*
15、遇到操作時7,添加到後綴表達式中 23456+-*7
16、把棧中剩下的符號都出棧 23456+-*7/+
代碼實現:
char* postfix_expression(string str) { char *temp=new char(100); int j=0; for(int i=0; i<str.size(); i++) { if(str[i]>=‘0‘ && str[i]<=‘9‘) temp[j++]=str[i]; else { if(str[i]==‘)‘) { while(S_c.top()!=‘(‘) { temp[j++] = S_c.top(); S_c.pop(); } S_c.pop(); } //如果符號是*或/高優先級,彈出所有*和/ else if(str[i]==‘*‘||str[i]==‘/‘) { if(!S_c.empty()) if(S_c.top()==‘*‘||S_c.top()==‘/‘) { temp[j++] = S_c.top(); S_c.pop(); } S_c.push(str[i]); } //如果符號是+或-低優先級,彈出所有*/+- else if(str[i]==‘+‘||str[i]==‘-‘) { if(!S_c.empty()) if(S_c.top()==‘*‘||S_c.top()==‘/‘||S_c.top()==‘+‘||S_c.top()==‘-‘) { temp[j++] = S_c.top(); S_c.pop(); } S_c.push(str[i]); } else S_c.push(str[i]); } } while(!S_c.empty()) { temp[j++] = S_c.top(); S_c.pop(); } return temp; }
第二個問題,如何使用後綴表達式來解表達式
後綴表達式已經將計算的優先順序排好,只需要將後綴表達式的數字逐個入棧,直到遇到符號,將前棧頂兩個元素運算放回棧頂即可。
以上面的後綴表達式為例:
23456+-*7/+
上代碼~
#include <iostream> #include <string> #include <cstring> #include <stack> using namespace std; stack<int> S_n; stack<char> S_c;
//上面的後綴表達式轉換函數 char* postfix_expression(string str); int main() { string str; char *pe; int temp; cin>>str; //將str轉為後綴表達式 pe = postfix_expression(str); for(int i=0; i<strlen(pe); i++) { if(pe[i]>=‘0‘&&pe[i]<=‘9‘) { S_n.push(pe[i]-‘0‘); } else if(pe[i]==‘*‘) { temp = S_n.top(); S_n.pop(); temp *= S_n.top(); S_n.pop(); S_n.push(temp); } else if(pe[i]==‘/‘) { temp = S_n.top(); S_n.pop(); temp = S_n.top()/temp; S_n.pop(); S_n.push(temp); } else if(pe[i]==‘+‘) { temp = S_n.top(); S_n.pop(); temp += S_n.top(); S_n.pop(); S_n.push(temp); } else if(pe[i]==‘-‘) { temp = S_n.top(); S_n.pop(); temp = S_n.top()-temp; S_n.pop(); S_n.push(temp); } } cout<<pe<<endl; cout<<S_n.top()<<endl; return 0; }
運行結果:
後綴表達式做計算器程序