POJ 中缀表达式的值
来源:互联网 发布:电子翻书制作软件 编辑:程序博客网 时间:2024/06/03 22:45
4:中缀表达式的值
- 总时间限制:
- 200ms
- 内存限制:
- 1024kB
- 描述
- 人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。
给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。 - 输入
- 第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。 - 输出
- 对每一组测试数据输出一行,为表达式的值
- 样例输入
33+5*8(3+5)*8(23+34*45/(5+6+7))
- 样例输出
4364108
#include<iostream>#include<string>#include<stack>#include<cstdio>using namespace std;const int N=1000;class RPN{public: RPN(string str):s(str) {} string transform() { stack<char> Stack; Stack.push('('); char rpn[N];//此项改为string 型出错。。。string rpn; int i=0,j=0; for(; s[i]!='\0'; i++) { if('0'<=s[i] && s[i]<='9') { rpn[j++]=s[i]; } else if(s[i]=='*' || s[i]=='/') { rpn[j++]=' '; if(Stack.top()=='*' || Stack.top()=='/') { rpn[j++]=Stack.top(); Stack.pop(); } Stack.push(s[i]); } else if(s[i]=='+' || s[i]=='-') { rpn[j++]=' '; if(Stack.top()=='*' || Stack.top()=='/') { rpn[j++]=Stack.top(); Stack.pop(); } if(Stack.top()=='+' || Stack.top()=='-') { rpn[j++]=Stack.top(); Stack.pop(); } Stack.push(s[i]); } else if(s[i]=='(' || s[i]==')') { if(s[i]=='(') { Stack.push(s[i]); } else { while(Stack.top()!='(') { rpn[j++]=Stack.top(); Stack.pop(); } Stack.pop(); } } } while(Stack.top()!='(') { rpn[j++]=Stack.top(); Stack.pop(); } rpn[j]='\0'; s=rpn; return rpn; } int Get_res() { //cout<<s<<endl; int a[N]= {0},i=0,j=0; for(i=0; s[i]!='\0'; i++) { if('0'<=s[i] && s[i]<='9') { int x=0; while('0'<=s[i] && s[i]<='9') { x=10*x+s[i]-'0'; i++; } a[j++]=x; i--; } else if(s[i]=='*' || s[i]=='/') { j--; if(s[i]=='*') { a[j-1]*=a[j]; } else { a[j-1]/=a[j]; } } else if(s[i]=='+' || s[i]=='-') { j--; if(s[i]=='+') { a[j-1]+=a[j]; } else { a[j-1]-=a[j]; } } else if(s[i]!=' ') cout<<"error"<<endl; } cout<<a[0]<<endl; return 0; }private: string s;};int main(){ //freopen("in.txt","r",stdin); int N; cin>>N; string str; while(cin>>str!=0) { RPN res(str); res.transform(); res.Get_res(); } return 0;}