ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-07-21 19:29:46  阅读:391  来源: 互联网

标签:操作数 中缀 后缀 栈顶 表示法 操作符 表达式


目录

中缀表达式

中缀表达式 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间
(如: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();
    }
};

标签:操作数,中缀,后缀,栈顶,表示法,操作符,表达式
来源: https://blog.csdn.net/weixin_46576333/article/details/118972614

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有