【LeetCode150】逆波兰表达式求值(栈)

简介: 根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:

一、题目

根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。


说明:


整数除法只保留整数部分。

给定逆波兰表达式总是有效的。即表达式总会得出有效数值且不存在除数为 0 的情况。

image.png

提示:


1 <= tokens.length <= 104

tokens[i] 要么是一个算符("+"、"-"、"*" 或 “/”),要么是一个在范围 [-200, 200] 内的整数

逆波兰表达式介绍:

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


平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。

该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

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


去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

二、思路

因为直接给出逆波兰表达式了,即后缀表达式,所以直接遇到数字就入栈,遇到运算符号时,就让栈中的两个数字进行相关运算。直到全部运算完毕。


每次判断当前的符号是否为数字稍稍麻烦,因为运算的数字可能有多位数(这样直接判断数字有点麻烦),那就直接判断当前符号是否为运算符。


细节:注意在switch中的每个case结尾需要加上break,否则会执行多个case。


c++的stl:

(1)isalpha() 用来判断一个字符是否是英文字母,相当于 isupper(c)||islower(c)。

(2)如果使用atoi时记得加上c_str(),如atoi(str.c_str())。


三、代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> stk;
        int n = tokens.size();
        for(int i = 0; i < n; i++){
            string& str = tokens[i];
            //如果为数字则入栈
            if(!isCalCha(str)){
                stk.push(atoi(str.c_str()));
            }else{
                int num2 = stk.top();
                stk.pop();
                int num1 = stk.top();
                stk.pop();
                switch(str[0]){
                    case '+':
                        stk.push(num1 + num2);
                        break;
                    case '-':
                        stk.push(num1 - num2);
                        break;
                    case '*':
                        stk.push(num1 * num2);
                        break;
                    case '/':
                        stk.push(num1 / num2);
                        break;
                }
            }
        }
        return stk.top();
    }
    //判断是否为运算符
    bool isCalCha(string str){
        if(str == "+" || str == "-" || str == "*" || str == "/"){
            return true;
        }else{
            return false;
        }
    }
};
相关文章
|
6月前
|
存储 算法 测试技术
力扣经典150题第五十四题:最小栈
力扣经典150题第五十四题:最小栈
54 0
|
7月前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
47 0
|
3月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
22 0
|
3月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
28 0
|
5月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
39 6
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
40 4
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
46 2
|
5月前
|
Python
【Leetcode刷题Python】232. 用栈实现队列
如何使用Python语言通过两个栈来实现队列的所有基本操作,包括入队(push)、出队(pop)、查看队首元素(peek)和判断队列是否为空(empty),并提供了相应的代码实现。
27 0
|
7月前
|
存储 算法 Python
二刷力扣--栈和队列
二刷力扣--栈和队列
|
6月前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题