中缀表达式转后缀表达式(逆波兰表示法)

中缀表达式

中缀表达式 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间
(如:3 + 4),中缀表达式是人们常用的算术表示方法。

不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。

与前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。

后缀表达式(逆波兰表示法)

逆波兰式,也叫后缀表达式(将运算符写在操作数之后)
如:3 4 +

中缀转后缀

(1)8+4-6*2用后缀表达式表示为:

8 4 + 6 2 * -

(2)2*(3+5)+7/1-4用后缀表达式表示为:

2 3 5 + * 7 1 / + 4 -

  1. 遍历中缀字符串序列
  2. 遇到操作数则直接输出
  3. 遇到操作符 如栈中没有数据 直接入栈
  4. 栈中有数据 如优先级大于栈顶操作符 入栈
  5. 该操作符优先级小于或者等于栈顶操作符 则输出栈顶操作符并出栈,该操作符继续与栈顶操作符比较,直到大于栈顶操作符 入栈
  6. 直到遍历完,并输出完栈中数据

4 + 5 / 2 * 3 - 6

  1. 遇到操作数 4,输出

  2. 遇到操作符 + ,栈中没有数据,直接入栈
    在这里插入图片描述

  3. 遇到操作数 5 ,输出

  4. 遇到操作符 / ,栈中有数据,比较 / 的优先级高于栈顶 +,则入栈
    在这里插入图片描述

  5. 遇到操作数 2 ,输出

  6. 遇到操作符 * ,栈中有数据,比较 * 与栈顶操作符的优先级相同,则出栈顶操作符并输出
    在这里插入图片描述

  7. 栈中有数据, * 继续与栈顶操作符继续比较,* 优先级大于 + ,则入栈
    在这里插入图片描述

  8. 遇到操作数 3,输出

  9. 遇到操作符 - ,栈中有数据,比较 - 的优先级小与栈顶操作符,出栈顶操作符并输出。
    在这里插入图片描述

  10. 栈中有数据,继续比较 - 与栈顶操作符优先级相同,则出栈顶操作符并输出
    在这里插入图片描述

  11. 栈中没有数据,- 直接入栈
    在这里插入图片描述

  12. 遇到操作数6,输出

  13. 遍历完,取出栈中操作符

在这里插入图片描述

  1. 得到后缀表达式 4 5 2 / 3 * + 6 -

后缀表达式求值

  1. 遍历后缀表达式字符串序列
  2. 遇到操作数入栈
  3. 遇到操作符则取两次栈顶数据出栈计算,第一次拿到的是右操作数
  4. 计算结果再次入栈
  5. 继续遍历 重复以上步骤
  6. 遍历完后缀表达式后,栈中剩余一个数,就是后缀表达式的计算结果

对应力扣题:逆波兰表达式求值
实现代码:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;//用来存放操作数

        for(auto& str : tokens){
            //1.遇到操作符 取数据计算
            if(str=="+"||str=="-"||str=="*"||str=="/"){
                //先取出来的是右操作数
                int right=st.top();
                st.pop();
                int left=st.top();
                st.pop();

                //把计算结果再入栈
                //swich不支持判断自定义类型 因为操作符string只有一个字符 所以用str[0] 拿到一个字符判断
                switch(str[0]){
                    case '+':
                        st.push(left+right);
                        break;
                    case '-':
                        st.push(left-right);
                        break;
                    case '*':
                        st.push(left*right);
                        break;
                    case '/':
                        st.push(left/right);
                        break;
                }
            }

            //2.遇到操作数就入栈
            else{
                //string 的sting转int 接口
                st.push(stoi(str));
            }
        }
        //遍历结束返回栈中数据
        return st.top();
    }
};
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值