算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、``以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
结尾无空行
输出样例:
2 3 7 4 - * + 8 4 / +
结尾无空行
代码:
# include <iostream>
using namespace std;
char stack[100],a[100],b[100];
int t1=-1,t2=-1;
char Pop( char c)
{
if( c == 'D')
return '/';
if( c == 'C')
return '*';
if( c == 'B')
return '+';
if( c == 'A')
return '-';
}
void Compare(char c)
{
if( c == ')')
{
while(stack[t1] != '(' && t1 != -1)
{
b[++t2] = Pop(stack[t1]);
b[++t2] = ' ';
stack[t1--] = '\0';
}
stack[t1--] = '\0';
}
else
{
while(stack[t1] >= c && stack[t1] != '(' && t1 != -1)
{
b[++t2] = Pop(stack[t1]);
b[++t2] = ' ';
stack[t1--] = '\0';
}
stack[++t1] = c;
}
}
int main()
{
cin >> a;
for(int i = 0 ; a[i] != '\0' ; i++)
{
if(a[i] == '(')
stack[++t1] = a[i];
else if (a[i] == '-' && (i == 0 || a[i - 1] == '('))
b[++t2] = a[i];
else if (a[i] == '+' && (i == 0 || a[i - 1] == '('))
continue;
else if (a[i] == '-' && i !=0 && a[i - 1] != '(')
Compare('A');
else if (a[i] == '+' && i != 0 && a[i - 1] != '(')
Compare('B');
else if (a[i] == '*')
Compare('C');
else if (a[i] == '/')
Compare('D');
else if (a[i] == ')')
Compare(')');
else{
b[++t2] = a[i];
if (a[i + 1] == '+' || a[i + 1] == '-' || a[i + 1] == '*'
|| a[i + 1] == '/' || a[i + 1] == '(' || a[i + 1] == ')' || a[i + 1] == '\0')
b[++t2] = ' ';
}
}
while (t1 != -1)
{
b[++t2] = Pop(stack[t1--]);
b[++t2] = ' ';
}
if(b[t2] == ' ')
b[t2--] = '\0';
cout << b;
return 0;
}