标签:
未整理完..
#include<iostream> #include<cstdio> #include<queue> #include<stack> using namespace std; struct PostfixExpre { string infix; PostfixExpre(string _infix) { infix = _infix; } int getPri(char c) { switch(c){ case ‘(‘: return 1; case ‘+‘: case ‘-‘: return 2; case ‘*‘: case ‘/‘: return 3; case ‘)‘: return 4; default://数字返回0 return 0; } } string getPostfix() { bool frist = true; stack<char>s; string post; int n = infix.size(); for(int i=0; i<n; ){ int pri = getPri(infix[i]); switch(pri) { case 0://如果是数字,将连续的数字加入后缀 if(!frist) //用于出去第一个空格 post += " "; else frist = false; while(i<n && !getPri(infix[i])) post += infix[i++]; break; case 1://如果是( 直接入栈 s.push(infix[i++]); break; case 2://如果是+ - 需要弹出栈中运算符优先级比infix[i]高或相等的运算符,并加入前缀,然后将infix[i]入栈 while(!s.empty() && getPri(s.top()) >= 2){ post += " "; post += s.top(); s.pop(); } s.push(infix[i++]); break; case 3://如果是* / 弹出栈中运算符优先级比infix[i]高或相等的运算符,并加入前缀,然后将infix[i]入栈 while(!s.empty() && getPri(s.top()) >= 3){ post += " "; post += s.top(); s.pop(); } s.push(infix[i++]); break; case 4://如果是 ) 弹出所有在最近的(之前的运算符,并加入后缀 while(s.top() != ‘(‘){ post += " "; post += s.top(); s.pop(); } s.pop(); // 弹出( i++; } } while(!s.empty()){ post += " "; post += + s.top(); s.pop(); } return post; } void printstack(stack<int> s) { while(!s.empty()){ cout<<s.top()<<" "; s.pop(); } cout<<endl; } bool isSinNum(int ch){ return ch >= 0 && ch <= 9; } //通过后缀表达式计算结果 要求后缀表达式格式数字与符号、符号与符号间用空格隔开 int getValue(string post) { stack<int>s; int n = post.size(); for(int i=0; i<n; ){ int res = 0; char c = post[i]; if(c>=‘0‘ && c<=‘9‘){ //如果是数字,提取所有连续数字,并将该数字入栈 while(i<n && c != ‘ ‘){ res = res*10+c-‘0‘; c = post[++i]; } s.push(res); // printstack(s); } else {//是符号,弹出栈前面两个数字,并计算,然后经结果入栈 int b = s.top(); s.pop(); int a = s.top(); s.pop(); switch(c){ case ‘+‘: res = a+b; break; case ‘-‘: res = a-b; break; case ‘*‘: res = a*b; break; case ‘/‘: res = a/b; break; } s.push(res); // printstack(s); i++; } i++;//跳过空格 } return s.top(); } }; int main(){ PostfixExpre p("121+10*(53-49+20)/((35-25)*2+10)+11"); cout<<p.getPostfix()<<endl; cout<<p.getValue("121 10 53 49 - 20 + * 35 25 - 2 * 10 + / + 11 +");//140 getchar(); return 0; }
标签:
原文地址:http://www.cnblogs.com/vegg117/p/4319365.html