中缀式变后缀式
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
-
输入
-
第一行输入一个整数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> #include <stack> using std::endl; using std::cin; using std::cout; using std::string; using std::stack; //定义运算符的优先级 int priority(char ch) { int num; switch(ch) { case '+': case '-': num=1; break; case '*': case '/': num=2; break; case '(': case ')': num=0; break; default: num=-1; break; } return num; } int main() { int T; cin >> T; //定义保存运算符的栈 stack<char> op; op.push('#'); while(T--) { string str1,str2; cin >> str1; //将中缀表达式转换为后缀表达式 for(int i=0;i<str1.length()-1;++i) {//扫描一遍输入的字符串进行转换 if(str1[i]=='(') { op.push(str1[i]); }else if(str1[i]==')') { //遇到(则停止弹出 while(op.top()!='(') { //操作符出栈之前打印空格 str2+=' '; str2+=op.top(); op.pop(); } //将左括号从栈中弹出 op.pop(); }else if(str1[i]=='+'||str1[i]=='-'||str1[i]=='*'||str1[i]=='/') { //如果当前的操作符比栈顶的操作符优先级大的话,则将当前操作符压入栈 if(priority(str1[i])>priority(op.top())) { op.push(str1[i]); }else{ //当前运算符优先级小,则将栈中运算符优先级大于等于当前的都从栈中弹出来 while(priority(op.top())>=priority(str1[i])) { //出栈之前打印空格 str2+=' '; str2+=op.top(); //将栈顶的运算符弹出 op.pop(); } //然后再压入当前的运算符 op.push(str1[i]); } }else{ //当是数字的时候或者小数点小数,判断是一个新的数,如果是则先打印空格 if(i>1&&(str1[i-1]=='+'||str1[i-1]=='-'||str1[i-1]=='*'||str1[i-1]=='/'||str1[i-1]=='(')) str2+=' '; str2+=str1[i]; } } //如果此时符号栈仍不为空则全部出栈 while(op.top()!='#') { //操作符出栈之前先打印空格 str2+=' '; str2+=op.top(); op.pop(); } str2+=" ="; cout << str2 << endl; } return 0; }
-
第一行输入一个整数n,共有n组测试数据(n<10)。