算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
样例输入与输出:
序号 | 输入 | 输出 |
1 | 2+3*(7-4)+8/4 | 2 3 7 4 - * + 8 4 / + |
2 | ((2+3)*4-(8+2))/5 | 2 3 + 4 * 8 2 + - 5 / |
3 | 1314+25.5*12 | 1314 25.5 12 * + |
4 | -2*(+3) | -2 3 * |
5 | 123 | 123 |
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[25];
gets(a);
int tmp=0;
int flag=0;
stack<char> ch;
int i;
for(i=0;a[i]!='\0';i++)
{
char c=a[i];
if((c>='0'&&c<='9')||c=='.')
{
if(c>='0'&&c<='9')
{
if(tmp==0&&flag==0)
{
cout<<c; tmp=1;
}
else if((a[i-1]>='0'&&a[i-1]<='9')||a[i-1]=='.') cout<<c;
else cout<<" "<<c;
}
else cout<<c;//c=='.',有非整数出现
}
else if(c=='+'||c=='-')
{
if(i==0||(!(a[i-1]>='0'&&a[i-1]<='9')&&a[i-1]!=')'))//运算数前有正负号
{
if(c=='-')
{
if(i==0) flag=1;
else cout<<" ";
cout<<c<<a[i+1]; i++;
}
}
else
{
while(!ch.empty()&&ch.top()!='(')
{
cout<<" "<<ch.top();
ch.pop();
}
ch.push(c);
}
}
else if(c=='/'||c=='*')
{
if(ch.top()=='/'||ch.top()=='*')
{
while(!ch.top()=='(')
{
cout<<" "<<ch.top();
ch.pop();
}
ch.push(c);
}
else ch.push(c);
}
else if(c=='(') ch.push(c);
else if(c==')')
{
ch.push(c);
while(1)
{
if(ch.top()==')') ch.pop();
if(ch.top()=='(')
{
ch.pop(); break;
}
else
{
cout<<" "<<ch.top(); ch.pop();
}
}
}
}
while(1)
{
if(ch.empty()) break;
if(ch.top()=='(') ch.pop();
else
{
cout<<" "<<ch.top(); ch.pop();
}
}
return 0;
}