每日一题(LeetCode)----栈和队列--逆波兰表达式求值

每日一题(LeetCode)----栈和队列--逆波兰表达式求值

1.题目(150. 逆波兰表达式求值

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

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

    注意:

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

    示例 1:

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

    示例 2:

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

    示例 3:

    c++ 复制代码
    输入: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 + * 也可以依据次序计算出正确结果。
    • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

2.解题思路

思路一:使用栈

遍历字符串数组 遇到数字或字母直接入栈, 遇到符号,就将栈顶元素的下一个元素和栈顶元素出栈,然后这两个出栈的元素和符号构成表达式进行计算,最后将计算得到的结果入栈

3.写出代码

思路一的代码

c++ 复制代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> sta;
        int length=tokens.size();
        for(int i=0;i<length;i++){
            if(tokens[i]!="+"&&tokens[i]!="-"&&tokens[i]!="*"&&tokens[i]!="/"){
                sta.push(atoi(tokens[i].c_str()));
            }
            else{
                //栈顶元素
                int temp1=sta.top();
                sta.pop();
                //栈顶的下一个元素
                int temp2=sta.top();
                sta.pop();
                if(tokens[i]=="+"){
                    sta.push(temp2+temp1);
                }
                if(tokens[i]=="-"){
                    sta.push(temp2-temp1);
                }
                if(tokens[i]=="*"){
                    sta.push(temp2*temp1);
                }
                if(tokens[i]=="/"){
                    sta.push(temp2/temp1);
                }
            }
        }
        int res=sta.top();
        sta.pop();
        return res;
    }
};
相关推荐
自由的dream37 分钟前
0-1背包问题
算法
2401_8572979143 分钟前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode
良月澪二2 小时前
CSP-S 2021 T1廊桥分配
算法·图论
wangyue43 小时前
c# 线性回归和多项式拟合
算法
&梧桐树夏3 小时前
【算法系列-链表】删除链表的倒数第N个结点
数据结构·算法·链表
QuantumStack3 小时前
【C++ 真题】B2037 奇偶数判断
数据结构·c++·算法
今天好像不上班3 小时前
软件验证与确认实验二-单元测试
测试工具·算法
wclass-zhengge4 小时前
数据结构篇(绪论)
java·数据结构·算法
何事驚慌4 小时前
2024/10/5 数据结构打卡
java·数据结构·算法