中缀表达式转后缀表达式

第一次遇见中后缀表达式是在牛客网上。当时师父和我讲了一下逻辑思路。算是懂了思路,但是没有去用代码实现。这段时间刚好数据结构上到栈和队列。老师的实验课就出了一道这样的题。

具体的题如下:

题目内容:
 算术表达式有前缀表示法、中缀表示法、后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,
即二元运算符位于两个运算数之间。请设计程序将中缀表达式转换为后缀表达式。
中缀表示:2+3-4
后缀表示:2 3 + 4 -, 符号在两个运算数据的后面。后缀表达有很多好处,例如可以不要括号,见下面
的样例。

输入描述
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、/、(、)运算符,以#结束表达式

输出描述
在一行中给出转换后的表达式,要求不同对象(运算数、运算符号)之间以空格分隔

输入样例
2+3*(7-4)#

输出样例
2 3 7 4 - * +

中缀转后缀的思路大概如下。
以sample input为例。
这是模拟代码的思路

对+ - 做优先级判断。对 * / 做优先级判断。

要注意的就是遇到括号的时候。需要做处理。
读取 ( 的时候直接入栈。
读取到 ) 则将之前入栈完的一次性输出前面入栈的元素

这里用了两个string,一个存中缀,一个存后缀,也就是结果。
代码如下:

for(int i=0;i<s.size()-1;i++){
        if(is_number(s[i]))
            s_back.push_back(s[i]);
        else if(s[i]=='+'||s[i]=='-'){
            while(1){
                if(!stk.empty() && stk.top()!='('){
                    s_back.push_back(stk.top());
                    stk.pop();
                }
                else{
                    stk.push(s[i]);
                    break;
                }
            }
        }
        else if(s[i]=='*'||s[i]=='/'){
            while(1){
                if(!stk.empty() && (stk.top()=='*'|| stk.top()=='/')){
                    s_back.push_back(stk.top());
                    stk.pop();
                }
                else{
                    stk.push(s[i]);
                    break;  
                }
            }
        }
        else if(s[i]=='('){
            stk.push(s[i]);
        }
        else if(s[i]==')'){
            while(1){
                if(stk.top()!='('){
                    s_back.push_back(stk.top());
                    stk.pop();
                }
                stk.pop();  //删除'(' 
                break;
            }
        }
    }

然后就是要把栈中剩余的运算符全部输出啦。

这里用了STL的stack。还用了string。

最近才刚开始接触STL和数据结构,所以在师父的引导下把这题做出来了。折腾了好久。。总而言之还是很开心。

有错误也欢迎指出哦~~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值