每日一练 · 后缀表达式

141 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

根据 逆波兰表示法,求该后缀表达式的计算结果。

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

 

说明:

整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 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] 内的整数  

逆波兰表达式:

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

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。 逆波兰表达式主要有以下两个优点:

去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

二、思路分析:

数字和算符都是依次被遍历,进入计算。参与计算的数字被抛出,计算的结果被保留,然后再让后续的数字或算符进入。整个过程特别适合用栈。 逆波兰后缀表达式计算: 1、把需要操作的数存入栈 2、遇到操作符,弹出栈顶两个计算,得到的数入栈 3、最后栈顶的就是计算结果 关键地方: 1.判断每个字符是数字还是操作者,数字需要关注的是是否有符号(-或+) 2.弹出的两个数,第一个数作为减数或者除数

三、AC 代码:

class Solution {

class MyStack<T>{
    class Node<T>{
        private T t;
        private Node next;
    }

    private Node<T> head;
    MyStack(){
        head = null;
    }

    public void push(T t) {
        if (t == null) {
            throw new NullPointerException("could not be null");
        }
        if (head == null) {
            head = new Node<T>();
            head.t = t;
            head.next = null;
        } else {
            Node<T> temp = head;
            head = new Node<>();
            head.t = t;
            head.next = temp;
        }
    }

    public T pop() {
        T t = head.t;
        head = head.next;
        return t;
    }

    public T peek() {
        T t = head.t;
        return t;
    }

    public boolean isEmpty() {
        if (head == null)
            return true;
        else
            return false;
    }
}
    public int evalRPN(String[] tokens) {
        MyStack<Integer> stack = new MyStack<>();
        for (String t : tokens)
        {
            if (!t.equals("+") && !t.equals("-") && !t.equals("*") && !t.equals("/"))
            {
                stack.push(Integer.parseInt(t));
            }
            else
            {
                int b = stack.pop();
                int a = stack.pop();
                if (t.equals("+"))
                    stack.push(a + b);
                else if (t.equals("-"))
                    stack.push(a - b);
                else if (t.equals("*"))
                    stack.push(a * b);
                else
                    stack.push(a / b);
            }
        }

        return stack.peek();
    }
}


四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!