nyoj 467(表达式求值)
中缀式变后缀式
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
#include<bits/stdc++.h> using namespace std; string a; struct exp { stack<char>f;//操作符栈 stack<double>s;//操作数栈 int prior(char ch)//运算符的优先级 { switch(ch) { case'+': case'-': return 1; case'*': case'%': case'/': return 2; default: return 0;//括号 } } string trans(string a) { while(!f.empty()) f.pop(); f.push('#'); string ret="";//保存中缀表达式 int len=a.size(),i=0; while(i<len) { if(a[i]==' '||a[i]=='=')//?? { i++; continue; } else if(a[i]=='(') f.push(a[i++]); else if(a[i]==')') { while(f.top()!='(') { ret+=f.top(); ret+=' '; f.pop(); } f.pop();//(出栈 i++; } else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'||a[i]=='%') { while(prior(f.top())>=prior(a[i]))//如果a[]的运算符的优先级小于等于栈顶元素的优先级,退栈运算符并放到后缀表达式中,直到a[i]的运算符优先级大于栈顶运算符的优先级 { ret+=f.top(); ret+=' '; f.pop(); } f.push(a[i++]); } else { while(a[i]>='0'&&a[i]<='9'||a[i]=='.') { ret+=a[i++]; } ret+=' '; } } while(f.top()!='#') { ret+=f.top(); ret+=' '; f.pop(); } ret+='=';c return ret; } }e; int main() { int num; scanf("%d",&num); while(num--) { cin>>a; cout<<e.trans(a)<<endl;//将中缀表达式装换为后缀表达式 } return 0; }