欢迎光临散文网 会员登陆 & 注册

150. 逆波兰表达式求值

2023-05-22 22:21 作者:薄荷硬糖酱  | 我要投稿

给你一个字符串数组 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 + * 也可以依据次序计算出正确结果。

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


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

波兰表达式:

就是将表达式表示成二叉树然后通过后续遍历表达出来,

通过利用栈可以将其结果计算出来

第一种法:

class Solution {

public:

    int evalRPN(vector<string>& tokens) {

        stack<long long> s;

        for(int i=0;i<tokens.size();i++){

            if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){

                long long a = s.top();s.pop();

                long long b = s.top();s.pop();

                long long temp=0;

                if(tokens[i]=="+"){

                    temp = a + b; 

                    s.push(temp);

                }else if(tokens[i]=="-"){

                    temp = b - a;

                    s.push(temp);

                }else if(tokens[i]=="*"){

                    temp = a * b;

                    s.push(temp);

                }else if(tokens[i]=="/"){

                    temp = b / a;

                    s.push(temp);

                }

            }else{

                s.push(stoll(tokens[i]));

            }

        }

        return s.top();

    }

};

注意:因为是后续遍历出来的字符串,所以因该是第二个作被除数,第一个作除数,

第二个作被减数,第一个作减数


150. 逆波兰表达式求值的评论 (共 条)

分享到微博请遵守国家法律