【每日一题】Day6 逆波兰表达式求值

本题来源于力扣中,链接如下:[编程题]逆波兰表达式求值

Day6 逆波兰表达式求值

1.题目要求

题目展示:

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

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

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

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

tip:
逆波兰表达式:

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

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

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

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


输入描述:

输入表达式,tokens的各项。

输出描述:

输出其转换为中缀算术表达式结果的值。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9

解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

示例 2:

输入:tokens = ["4","13","5","/","+"]
输出:6

解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6


2.解题思路

【题目解析】:

本题是力扣上的一道题,简单来说就将其中的数组中的后缀表达式转化回中缀表达式,然后计算得到这个中缀表达式的值。

首先我们要了解什么是后缀表达式,什么是中缀表达式。中缀表达式(或中缀记法)是一个通用的算术或逻辑公式表示方法,也就是我们平时看见的就是中缀表达式,比如(3+4)*5这种。而后缀表达式就是+ - * /这几个符号放数字的后面了。

这里是一个简单的中缀转后缀的方法:

【解题思路】:

这道题目我们用栈来做,思路也很简单。栈的思想就是一个箱子,先放进去的后拿出来,所以我们可以将后缀表达式一个一个放进去,然后我们知道,一个运算符前面就是数字,所以当我们遇到运算符,就拿出来运算就行了,然后把结果放回去,重复即可。

比如,(3+4)*5-2,后缀表达式也就是34+5*2-

我们先创建一个栈,然后放入3,然后放入4,再放入+,这时候是一个运算符,就拿出来,然后再将4拿出来,然后是3,再进行运算得到7,放入7,然后拿5,拿*,是运算符,取出5,再取出7,进行运算得35

所以我们的步骤就是:

1.创建一个栈
2.将后缀表达式的元素挨个拿出放入栈中
3.放入前先判断是否为运算符
4.不是运算符就放入栈,是运算符就取出栈中数字并进行相应运算
5.返回结果


3.参考代码

class Solution {
    
    
    public int evalRPN(String[] tokens) {
    
    
           
            Stack<Integer> stack = new Stack<>();//创建栈
            for(int i=0;i<tokens.length;i++){
    
    
                String val = tokens[i];
                if(func(val) == false){
    
    
                    stack.push(Integer.parseInt(val));
                }else{
    
    
                    int num2 = stack.pop();
                    int num1 = stack.pop();  
                switch(val){
    
    
                        case "+":
                            stack.push(num1+num2);
                            break;
                        case "-":
                            stack.push(num1-num2);
                            break;
                        case "*":
                            stack.push(num1*num2);
                            break;
                        case "/":
                            stack.push(num1/num2);
                            break;
                    }
                }
            }
             return stack.pop();
    }

    //判断是否是+ - * /的方法
    private boolean func(String str){
    
    
        if(str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/") ){
    
    
            return true;
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_54225715/article/details/124578451