每日一题(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;
    }
};
相关推荐
.格子衫.2 小时前
022数据结构之树状数组——算法备赛
数据结构·算法·1024程序员节
黑科技Python2 小时前
生活中的“小智慧”——认识算法
学习·算法·生活
sali-tec3 小时前
C# 基于halcon的视觉工作流-章52-生成标定板
开发语言·图像处理·人工智能·算法·计算机视觉
IT古董3 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合
人工智能·算法·1024程序员节
熬了夜的程序员3 小时前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
對玛祷至昏4 小时前
数据结构理论知识
数据结构·算法·排序算法
oliveira-time4 小时前
二分搜索(Binary Search)
算法
王哈哈^_^5 小时前
【数据集】【YOLO】【目标检测】口罩数据集,口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·ai·视觉检测
dragoooon345 小时前
[优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
数据结构·算法·leetcode·1024程序员节
py有趣6 小时前
LeetCode算法学习之移除元素
java·数据结构·算法