中缀表达式转化为后缀表达式
描述
输入一个中缀算术表达式,将其转换为后缀表达式。运算符包括+、-、*、/、(、)、=,参加运算的为小于10的自然数。(只考虑二元运算即可)
输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。
输出
对于每组数据输出一行,为表达式的后缀式。
样例输入1
9+(3-1)*3+1/2= 1+2= =
样例输出1
931-3*+12/+ 12+
解答:开辟一个符号栈,初始化符号栈时将'='入栈。顺序读取字符串,遇到数字时直接输出当前数字;遇到运算符时,判断符号栈栈顶元素与当前运算符的优先关系。当优先关系为'>'时,输出符号栈栈顶元素,当前符号不变;当优先关系为'<'时,将当前符号入符号栈,读取下一个字符;当优先关系为 '='时,将符号栈栈顶元素出栈。
#include<stdio.h>
#include<stack>
using namespace std;
char Precede(char a,char b)
{
if((a=='('&&b==')')||(a=='='&&b=='='))
return '=';
else if(a=='='||a=='('||b=='('||((a=='+'||a=='-')&&(b=='*'||b=='/')))
return '<';
else
return '>';
}
int main()
{
char oper;
char s[100];
while(1)
{
gets(s);
stack<char> op;
op.push('=');
if(s[0]=='=')
break;
for(int i=0; s[i]!='\0'; i++)
{
if(s[i]>='0' && s[i]<='9')
printf("%c",s[i]);
else
{
while(1)
{
if(Precede(op.top(),s[i])=='<')
{
op.push(s[i]);
break;
}
else if(Precede(op.top(),s[i])=='>')
{
oper=op.top();
op.pop();
printf("%c",oper);
}
else
{
op.pop();
break;
}
}
}
}
printf("\n");
}
return 0;
}