算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
这道题很多细节要注意
#include<iostream>
#include<bits/stdc++.h>//万能开头
#include<algorithm>
#include<string.h>
#include<math.h>
#include<stack>
using namespace std;
void f(string str)
{
stack<char>s;
map<char,int>m;
m['+'] = m['-'] = 1;m['*'] = m['/'] = 2;m['('] = m[')'] = 3;//方便后面48行的书写
int i=0,j=0;
while(i<str.length())
{
if(isdigit(str[i])||(i<1||str[i-1]=='(')&&(str[i]=='+'||str[i]=='-'))//判断数字和+2这种带符号数
{
if(i!=0&&j!=0)
{
cout<<" ";
}
else j++;
if(str[i]!='+')cout<<str[i];//这一点要注意 可能是- 正号不用输出 但负号要输出 数字输出
while(str[i+1]=='.'||isdigit(str[i+1]))//多个数字 例如111 11.2
{
i++;
cout<<str[i];
}
i++;
}
else
{
if(str[i]=='(') //考虑情况较少 先判断
{
s.push(str[i]);
}
else if(str[i]==')')
{
while(!s.empty()&&s.top()!='(')
{
cout<<" "<<s.top();
s.pop();
}
s.pop();
}
else
{
while(!s.empty()&&m[s.top()]>=m[str[i]]&&s.top()!='(')
{
cout<<" "<<s.top();
s.pop();
}
s.push(str[i]);
}
i++;
}
}
while(!s.empty())//输出全部内容
{
cout<<" "<<s.top();
s.pop();
}
}
int main()
{
string str;
cin>>str;
f(str);
return 0;
}