zoukankan      html  css  js  c++  java
  • Lc150_逆波兰表达式求值

     1import java.util.Stack;
    2
    3/**
    4 * 150. 逆波兰表达式求值
    5 * 根据 逆波兰表示法,求表达式的值。
    6 * <p>
    7 * 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
    8 * <p>
    9 * <p>
    10 * <p>
    11 * 说明:
    12 * <p>
    13 * 整数除法只保留整数部分。
    14 * 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
    15 * <p>
    16 * <p>
    17 * 示例 1:
    18 * <p>
    19 * 输入: ["2", "1", "+", "3", "*"]
    20 * 输出: 9
    21 * 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
    22 * 示例 2:
    23 * <p>
    24 * 输入: ["4", "13", "5", "/", "+"]
    25 * 输出: 6
    26 * 解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
    27 * 示例 3:
    28 * <p>
    29 * 输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
    30 * 输出: 22
    31 * 解释:
    32 * 该算式转化为常见的中缀算术表达式为:
    33 * ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
    34 * = ((10 * (6 / (12 * -11))) + 17) + 5
    35 * = ((10 * (6 / -132)) + 17) + 5
    36 * = ((10 * 0) + 17) + 5
    37 * = (0 + 17) + 5
    38 * = 17 + 5
    39 * = 22
    40 * <p>
    41 * <p>
    42 * 逆波兰表达式:
    43 * <p>
    44 * 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
    45 * <p>
    46 * 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
    47 * 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
    48 * 逆波兰表达式主要有以下两个优点:
    49 * <p>
    50 * 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
    51 * 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
    52 * 通过次数72,706提交次数142,047
    53 */

    54public class EvalRPN {
    55    /**
    56     * 这道题俩种思路
    57     * 第一种二叉树后序遍历
    58     * 第二种栈,利用后续遍历的的思路 避开优先级考虑
    59     * 注意栈是先进后出,所以取值后要反着用
    60     *
    61     * @param tokens
    62     * @return
    63     */

    64    public static int evalRPN(String[] tokens) {
    65        Stack<Integer> stack = new Stack<>();
    66        for (int i = 0; i < tokens.length; i++) {
    67            if (tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) {
    68                int sum2 = stack.pop();
    69                int sum1 = stack.pop();
    70                if (tokens[i].equals("+")) {
    71                    stack.push(sum1 + sum2);
    72                } else if (tokens[i].equals("-")) {
    73                    stack.push(sum1 - sum2);
    74                } else if (tokens[i].equals("*")) {
    75                    stack.push(sum1 * sum2);
    76                } else if (tokens[i].equals("/")) {
    77                    stack.push(sum1 / sum2);
    78                }
    79            } else {
    80                stack.push(Integer.valueOf(tokens[i]));
    81            }
    82        }
    83        return Integer.valueOf(stack.pop());
    84    }
    85
    86    public static void main(String[] args) {
    87        String[] tokens = {"4""13""5""/""+"};
    88        System.out.println(evalRPN(tokens));
    89    }
    90}
    不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!
  • 相关阅读:
    flask1 + jinja2 day88
    linux9
    linux8 redis集群槽+docker
    dsadfa
    redis
    aaa
    a
    题目
    java对含有中文的字符串进行Unicode编码
    Java转Double类型经纬度为度分秒格式
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/14503978.html
Copyright © 2011-2022 走看看