• 150. 逆波兰表达式求值


    150. 逆波兰表达式求值

    根据 逆波兰表示法,求表达式的值。

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

    注意 两个整数之间的除法只保留整数部分。

    可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

    示例 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] 内的一个整数

    解析:

    压栈,遇到运算符就弹出栈顶两个,运算即可

    中缀->后缀表达式:运算符优先级严格递增栈,遇到左括号压栈,右括号出栈,括号内也符合严格递增

    class Solution {
    public:
        int transfer(string str)
        {
            int flag = str[0] == '-' ? 1 : 0;
            int ret = 0;
            for(int i = flag; i < str.length(); i++)
            {
                ret *= 10;
                ret += str[i] - '0';
            }
            return flag == 1 ? -ret : ret;
        }
    
    
    
        int evalRPN(vector<string>& tokens) {
            int ret = 0;
            stack<string> ss;
            for(int i = 0; i < tokens.size(); i++)
            {
                if(tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")
                {
                    ss.push(tokens[i]);
                }
                else
                {
                    int y = transfer(ss.top()); ss.pop();
                    int x = transfer(ss.top()); ss.pop();
                    if(tokens[i] == "+")
                    {
                        ss.push(to_string(x + y));
                    }
                    else if(tokens[i] == "-")
                        ss.push(to_string(x - y));
                    else if(tokens[i] == "*")
                        ss.push(to_string(x * y));
                    else ss.push(to_string(int(x / y)));
                }
    
            }
            ret = transfer(ss.top());
            return ret;
    
        }
    };
  • 相关阅读:
    Vue.js $nextTick
    JS---函数名和变量名重名
    for循环中嵌套setTimeout,执行顺序和结果该如何理解?
    Rocket MQ整体简介
    ant Desgn Pro Vue 修改 title
    STS插件创建springboot项目,pom第一行报unkown错误
    c# 读取二进制文件并转换为 16 进制显示
    c# Winform 调用可执行 exe 文件
    按字节读取txt文件缓存区大小设置多少比较好?
    天翼云服务开放端口
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16687474.html
Copyright © 2020-2023  润新知