算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
算法解释可查看 作者:Max伏虎 在bilibili上的分享 :中缀表达式 转 后缀表达式
下面是代码实现:
#include <iostream>
#include <stack>
#include <string.h>
using namespace std;
stack<char> s;
void priority(char x)
{
if(s.empty()==1 || s.top()=='(')
{
s.push(x);
return;
}
if(x==')')
{
while(s.top()!='(')
{
cout<<s.top()<<" ";
s.pop();
}
s.pop(); //弹出左括号
}else{
if(s.top()=='*' || s.top()=='/')
{
while(s.empty()==0)
{
cout<<s.top()<<" ";
s.pop();
}
s.push(x);
}
}
}
int main()
{
char expression[25];
cin>>expression;
for(int i=0;i<strlen(expression);i++)
{
if(expression[i] <= '9' && expression[i] >= '0')
{
cout<<expression[i]<<" ";
continue;
}else if(expression[i]=='+')
{
priority('+');
}else if(expression[i]=='-')
{
priority('-');
}else if(expression[i]=='*')
{
s.push('*');
}else if(expression[i]=='/')
{
s.push('/');
}else if(expression[i]=='(')
{
s.push('(');
}else if(expression[i]==')')
{
priority(')');
}
}
while(s.empty()==0)
{
cout<<s.top()<<" ";
s.pop();
}
return 0;
}
上述代码明显存在一定的问题,当数为2位数或是更高位时,该代码仅单位识别,相应地,还请读者自行修改完善。