-
总时间限制:
- 200ms 内存限制:
- 1024kB
-
描述
-
人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。
给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。
输入
-
第一行为测试数据的组数N
接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。
输出
- 对每一组测试数据输出一行,为表达式的值 样例输入
-
3 3+5*8 (3+5)*8 (23+34*45/(5+6+7))
样例输出
-
43 64 108
提示
-
注意:运算过程均为整数运算(除法运算'/'即按照C++定义的int除以int的结果,测试数据不会出现除数为0的情况),输出结果也为整数(可能为负)。
中间计算结果可能为负。
-
-
-
100多行的代码。未能过此题,始终觉得是个遗憾。。
-
第一次写表达式求值
-
-
要先设置一个运算符的栈,从左只有扫描中缀表达式(百度的哦)
1、如果遇到数字,直接放到后缀表达式尾;
2、如果遇到遇到运算符
a:若此时栈空,则直接入栈;
b:循环:若栈st不空且栈顶运算符的优先级大于等于当前的运算符,则栈顶运算符出栈,置于后缀表达式尾;
c:若栈不空且栈顶运算符的优先级小于当前的运算符,则将此运算符直接入栈;
反复执行1,2,直到整个中缀表达式扫描完毕,若此时栈不空,则将栈顶的运算符依次出栈,依次置于后缀表达式尾。
-
下面是错误代码。求指正。。
-
100多行不容易看。。。
-
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<assert.h> #include<ctype.h> #include<stack> using namespace std; int main() { int N; scanf("%d%*c",&N); while(N--) { char a[1001],b[1001]; gets(a); stack<char> hou; stack<int> ji; int i,h=0; int len=strlen(a); for(i=0; i<len; i++) { if(isalnum(a[i])) { while(isalnum(a[i])&&i<len) { b[h++]=a[i++]; } b[h++]='!'; } if(a[i]=='(')hou.push(a[i]); if(a[i]=='*'||a[i]=='/'){ while(!hou.empty()&&hou.top()!='('&&(hou.top()=='*'||hou.top()=='/')){ b[h++]=hou.top(); hou.pop(); } hou.push(a[i]); } if(a[i]=='+'||a[i]=='-') { while(!hou.empty()&&hou.top()!='('&&(hou.top()=='*'||hou.top()=='/'||hou.top()=='+'||hou.top()=='-')) { b[h++]=hou.top(); hou.pop(); } hou.push(a[i]); } if(a[i]==')') { while(!hou.empty()&&hou.top()!='(') { b[h++]=hou.top(); hou.pop(); } hou.pop(); } } while(!hou.empty()) { b[h++]=hou.top(); hou.pop(); } int T[100]= {0}, G=0; int a1,a2; int ans; for(i=0; i<h; i++) { if(isalnum(b[i])) { while(b[i]!='!'&&i<h) { T[G]=T[G]*10+(b[i]-'0'); i++; } if(b[i]=='!') { ji.push(T[G]); G++; } } if(b[i]=='+') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a1+a2; ji.push(ans); } if(b[i]=='*') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a1*a2; ji.push(ans); } if(b[i]=='-') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a2-a1; ji.push(ans); } if(b[i]=='/') { if(!ji.empty()) { a1=ji.top(); ji.pop(); } if(!ji.empty()) { a2=ji.top(); ji.pop(); } ans=a2/a1; ji.push(ans); } } if(!ji.empty()){ans=ji.top();} printf("%d\n",ans); } return 0; }
-