理解:分成4种情况这里不介绍,这里讲本质。后缀表达式的运算符优先级,是把前缀的运算符排列出一个优先级,然后从最优先输出的,不一定连续输出。而4种情况就是对优先级的处理。
Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample
Input
a*b+(c-d/e)*f#
Output
ab*cde/-f*+
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int top=0;
char Str[1001],Stack[101];
int main()
{
cin>>Str;
for(int i=0; Str[i]!='#'; i++)
{
if(Str[i]>='a'&&Str[i]<='z')
{
cout<<Str[i];
}
else if(Str[i]=='(')
{
Stack[++top]=Str[i];
}
else if(Str[i]==')')
{
while(Stack[top]!='(')
{
cout<<Stack[top--];
}
top--;
}
else if(Str[i]=='+'||Str[i]=='-')//后来的,+和-,一定在所有运算符的最后。
{
while(top&&Stack[top]!='(')
{
cout<<Stack[top--];
}
Stack[++top]=Str[i];
}
else if(Str[i]=='*'||Str[i]=='/')
{
while(top&&Stack[top]!='('&&(Stack[top]=='*'||Stack[top]=='/'))//先来的乘和除,一定比后来的乘和除优先,所以把前面的乘和除出栈。
{
cout<<Stack[top--];
}
Stack[++top]=Str[i];
}
}
while(top)
{
cout<<Stack[top--];
}
puts("");
return 0;
}