如何做到中缀表达式转后缀表达式?
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int top=-1;
char a[50];//数组模拟栈
char ch;
while((ch=getchar())!='\n')//一个一个字符读入
{
if('A'<=ch&&ch<='z') cout<<ch;//如果是字符直接输出。
else if(top==-1) a[++top]=ch;//如果栈为空直接将运算符进入
else if(ch=='(') a[++top]=ch;
else if(ch==')') //考虑括号,括号会改变运算符的优先级
{
while(a[top]!='(')
{
cout<<a[top--];
}
top--;
}
else if(ch=='*' || ch=='/') //乘除法的优先级大于加减法
{
if(a[top]=='*' || a[top]=='/')//如果栈顶是乘除法,输出栈顶,再进栈。
{
cout<<a[top--];
a[++top]=ch;
}
else //如果栈顶是加减法或是括号就进栈。
{
a[++top]=ch;
}
}
else if(ch=='+' || ch=='-')//加减法优先级较小
{
if(a[top]=='(')//考虑栈顶是不是括号
a[++top]=ch;
else if(a[top]=='+' || a[top]=='-')//栈顶是加减,就输出,再进栈
{
cout<<a[top--]; //加一减一等于零嘛,其实可以不用写++--的,直接赋值即可
a[++top]=ch; //即,可写成 cout<<a[top];a[top]=ch;
}
else if(a[top]=='*' || a[top]=='/')//栈顶是乘除,就考虑栈顶的前一位是否为空
{
cout<<a[top--];//先输出栈顶
if(top!=0) cout<<a[top--];//如果不是空就继续输出栈顶
a[++top]=ch;//再进栈
}
}
}
while(top>=0)
cout<<a[top--];//把剩下的符号都输出
return 0;
}