描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
-
输入
-
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
- 每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。 样例输入
-
2 1.000+2/4= ((1+2)*5+1)/4=
样例输出
-
1.000 2 4 / + = 1 2 + 5 * 1 + 4 / =
这一题主要是为了巩固数据结构的栈,一个栈的典型的例子。。中缀表达式转化为后缀表达式(逆波兰试)。。。弱爆了还得进一步练习啊,,,
AC代码:
#include<iostream> #include<string.h> #include<string> #include<stack> using namespace std; stack<char> fu; int ran(char a) { if(a=='#') return 0; if(a=='(') return 1; if(a=='+'||a=='-') return 2; if(a=='*'||a=='/') return 3; } void doit(string str) { int m=str.size(); string shu=""; bool flag(false); fu.push('#'); for(int i=0;i<m-1;++i) { if(isdigit(str[i])||str[i]=='.') flag=true; else flag=false; if(flag) shu+=str[i]; else { if(!shu.empty()) cout<<shu<<" "; shu=""; if(str[i]=='(') fu.push(str[i]); else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/') { int cmp=ran(str[i])-ran(fu.top()); if(cmp>0) fu.push(str[i]); else { while(ran(str[i])-ran(fu.top())<=0) { cout<<fu.top()<<" "; fu.pop(); } fu.push(str[i]); } } else if(str[i]==')') { while(fu.top()!='(') { cout<<fu.top()<<" "; fu.pop(); } fu.pop(); } } } if(flag) cout<<shu<<" "; while(fu.top()!='#') { cout<<fu.top()<<" "; fu.pop(); } cout<<"="<<endl; } int main() { int n; cin>>n; while(n--) { string s; cin>>s; doit(s); } return 0; }