• 力扣第150题 逆波兰表达式求值 stack c++


    题目

    150. 逆波兰表达式求值

    中等

    给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

    请你计算该表达式。返回一个表示表达式值的整数。

    注意:

    • 有效的算符为 '+''-''*' 和 '/' 。
    • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
    • 两个整数之间的除法总是 向零截断 。
    • 表达式中不含除零运算。
    • 输入是一个根据逆波兰表示法表示的算术表达式。
    • 答案及所有中间计算结果可以用 32 位 整数表示。

    示例 1:

    输入:tokens = ["2","1","+","3","*"]
    输出:9
    解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
    

    示例 2:

    输入:tokens = ["4","13","5","/","+"]
    输出:6
    解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
    

    示例 3:

    输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
    输出:22
    解释:该算式转化为常见的中缀算术表达式为:
      ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
    = ((10 * (6 / (12 * -11))) + 17) + 5
    = ((10 * (6 / -132)) + 17) + 5
    = ((10 * 0) + 17) + 5
    = (0 + 17) + 5
    = 17 + 5
    = 22

    提示:

    • 1 <= tokens.length <= 104
    • tokens[i] 是一个算符("+""-""*" 或 "/"),或是在范围 [-200, 200] 内的一个整数

    逆波兰表达式:

    逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

    • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
    • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

    逆波兰表达式主要有以下两个优点:

    • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
    • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

    思路和解题方法

            首先,我们创建一个栈 stk 用于存储数字。然后遍历字符串数组 tokens 中的每一个元素。

            如果当前元素是数字,我们将其转换为整数并将其压入栈 stk 中。

            如果当前元素是操作符,我们从栈 stk 中弹出两个元素进行计算,并将计算结果压入栈 stk 中。

            最后,栈顶元素即为逆波兰表达式的计算结果,将其返回即可。

    在实现过程中,我们使用一个辅助函数 isNumber(),通过判断当前元素是否为运算符来确定相应的操作。

    复杂度

            时间复杂度:

                    O(n)

    空间复杂度均为 O(n),其中 n 是字符串数组 tokens 的长度。

            空间复杂度

                    O(n)

    空间复杂度为 O(n)。

    c++ 代码

     ​
    
    1. class Solution {
    2. public:
    3. int evalRPN(vector& tokens) {
    4. stack<int> stk; // 创建一个栈用于存储数字
    5. int n = tokens.size(); // 获取字符串数组的长度
    6. for (int i = 0; i < n; i++) { // 遍历字符串数组中的每一个元素
    7. string& token = tokens[i];
    8. if (isNumber(token)) { // 如果当前元素是数字
    9. stk.push(atoi(token.c_str())); // 将其转换为整数并压入栈中
    10. } else { // 如果当前元素是操作符
    11. int num2 = stk.top(); // 从栈中弹出第二个数字
    12. stk.pop();
    13. int num1 = stk.top(); // 从栈中弹出第一个数字
    14. stk.pop();
    15. switch (token[0]) { // 根据操作符进行计算并将结果压入栈中
    16. case '+':
    17. stk.push(num1 + num2);
    18. break;
    19. case '-':
    20. stk.push(num1 - num2);
    21. break;
    22. case '*':
    23. stk.push(num1 * num2);
    24. break;
    25. case '/':
    26. stk.push(num1 / num2);
    27. break;
    28. }
    29. }
    30. }
    31. return stk.top(); // 返回栈顶元素作为逆波兰表达式的计算结果
    32. }
    33. bool isNumber(string& token) { // 判断当前元素是否是数字
    34. return !(token == "+" || token == "-" || token == "*" || token == "/");
    35. }
    36. };

    觉得有用的话可以点点赞,支持一下。

    如果愿意的话关注一下。会对你有更多的帮助。

    每天都会不定时更新哦  >人<  。

  • 相关阅读:
    BlueTeam 加固
    九、【React基础】组件的生命周期
    VoLTE基础自学系列 | eSRVCC稳态呼叫切换流程
    本地部署企业邮箱,让企业办公更安全高效
    Influence Matters 成立印度尼西亚办公室,构建北亚及东南亚服务中心
    【日期时间的计算NSDate Objective-C语言】
    110-注解JSONField、DateTimeFormat、JsonFormat、JsonProperty
    Turtlebot4入门教程-相关资源
    【springboot】13、Thymeleaf
    赴日开发工程师工作怎么找?
  • 原文地址:https://blog.csdn.net/jgk666666/article/details/133470673