7-1 表达式转换 (100分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include<bits/stdc++.h>
using namespace std;
stack<char>st;//用C++中自带的stack类方便很多
map<char,int> Rank;//这里简单用map容器来存储一下对加减乘除优先级的比较
int main(){
Rank['+']=Rank['-']=1;
Rank['*']=Rank['/']=2;//用于下面比较优先级时直接用1和2进行比较
string str;//输入的一串数字
cin>>str;
bool isfirst=true;//用于控制下面的输出前面的空格格式
for(int i=0;str[i];i++){
//先判断和处理数字和特殊情况
//判断str[i]为整数,为小数点以及正负号与数字一起输出有关的特殊情况
if( ( isdigit(str[i]) ) || (str[i]=='.') || ( (i==0||str[i-1]=='(') && (str[i]=='+'||str[i]=='-') )){
//判断是数字前面的正号这里的判定条件比较特别
//除了是输入语句的第一个字符或者是前括号之后的第一个字符为+才判定为正号而不是加号
//因为数字前面的正号不需要输出
if(!isfirst)//如果不是首字符则输出空格用来控制格式与题目要求对应
cout<<" ";
if(str[i]!='+')//如果是负号直接输出,正数则不用
cout<<str[i];
while(str[i+1]=='.'||isdigit(str[i+1]))//如果是小数就继续往后读
{
cout<<str[++i];
}isfirst=false;
}else//为运算符时
{
if(str[i]=='(')//如果是左括号,压入栈中
{
st.push(str[i]);
}else if(str[i]==')')
//如果是右括号,则依次将栈中的运算符弹出并输出,直到遇到左括号,并丢弃这对括号
{
while(!st.empty()&&st.top()!='(')//栈不为空且栈顶元素不为(
{
cout<<" "<<st.top();//输出
st.pop();
}st.pop();//将左括号弹出栈不输出
}else if(st.empty()||Rank[str[i]]>Rank[st.top()]){
//当为空栈或者读入运算符优先级比栈顶元素高时,入栈
st.push(str[i]);
}else{
//当读入运算符优先级比栈顶元素小或者相等时
while(!st.empty()&&st.top()!='(')
{
cout<<" "<<st.top();//输出栈顶元素并出栈
st.pop();
}st.push(str[i]);//将运算符入栈
}
}
}//最后把堆栈中存留的运算符全部输出
while(!st.empty()){
cout<<" "<<st.top();
st.pop();
}return 0;
}