7-1 表达式转换 (100分)(STL做法 简洁 带有全面的代码分析)

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;
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值