描述
我们熟悉的表达式如a+b、a+b(c+d)等都属于中缀表达式。中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand。ACM队的“C小加”正在郁闷怎样把一个中缀表达式转换为后缀表达式,现在请你设计一个程序,帮助C小加把中缀表达式转换成后缀表达式。为简化问题,操作数均为个位数,操作符只有+-/ 和小括号。
- 输入
第一行输入T,表示有T组测试数据(T<10)。每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个表达式。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。并且输入数据不会出现不匹配现象。 - 输出
每组输出都单独成行,输出转换的后缀表达式。 - 样例输入
2
1+2
(1+2)3+45 - 样例输出
12+
12+345+
分析:
其实就只是一个最简单的中缀转后缀的方法,而且题上还不涉及小数,也没有必要将操作数分割。
代码:
#include<string>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char a[1009],b[1009];
char pri[300];
void trans(char a[])
{
stack<char>q;
q.push('=');
int j=0;
for(int i=0; a[i]!=' '; i++)
{
if(a[i]>='0'&&a[i]<='9')
b[j++]=a[i];
else if(a[i]=='(')
q.push(a[i]);
else if(a[i]==')')
{
while(q.top()!='(')
{
b[j++]=q.top();
q.pop();
}
q.pop();
}
else
{
while(pri[a[i]]<=pri[q.top()])
{
b[j++]=q.top();
q.pop();
}
q.push(a[i]);
}
}
while(q.top()!='=')
{
b[j++]=q.top();
q.pop();
}
b[j]=' ';
}
int main()
{
int T;
pri['=']=-1;
pri['(']=0;
pri['+']=1;
pri['-']=1;
pri['*']=2;
pri['/']=2;
pri[')']=3;
scanf("%d",&T);
while (T--)
{
memset(a,' ',sizeof(a));
memset(b,' ',sizeof(b));
scanf(" %s",a);
// puts(a);
trans(a);
puts(b);
}
return 0;
}