中缀表达式转后缀表达式及后缀表达式的计算

目录

1. 中缀和后缀表达式的含义

2. 使用后缀表达式的原因

3. 后缀表达式的计算方法(栈)

4. 相关题目


中缀和后缀表达式的含义

我们平时使用的数学运算表达式就称做中缀表达式。

而后缀表达式是一种没有括号的表达式,它将运算符号后置。

示例:

四则表达式:9+(3-1)x3+10÷2

后缀表达式:9 3 1 - 3 x + 10 2 / +

使用后缀表达式的原因

由于早年的计算机没有括号来规定四则运算的运算顺序,因此为了服务于计算机的计算,波兰逻辑学家Jan Lukasiewicz就发明了后缀表达式,同时,这样的表达式也被称为逆波兰表达式,大家如果在一些题目或博客中看到这样的说法就不要感到疑惑啦。

后缀表达式的计算方法(栈)

在了解后缀表达式的计算方法之前,我们需要引入一种数据结构 ---- 栈。

栈是一种先进后出的数据结构,它可以很好地解决这个问题,具体形式可以见下图:

 我们按顺序将数字压入栈,遇到运算符,如“+”、“-”、“/”、“*”时,将栈顶前两个元素取出并进行运算,再将得到的结果数字压入栈,一直循环,直到表达式结束,将最后的运算结果压出就是运算式的结果。

相关题目

逆波兰表达式求值 https://leetcode.cn/problems/8Zf90G/description/

思路:此题含义便是我们上面后缀表达式的计算方式,只要我们了解了,通过栈的数据结构这题就变得迎刃而解了!

答案:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(int i = 0;i < tokens.length;i++){
            String tmp = tokens[i];
            if(!isOperation(tmp)){
                Integer val = Integer.valueOf(tmp);
                stack.push(val);
            }
            else{
                Integer val2 = stack.pop();
                Integer val1 = stack.pop();
                switch(tmp){
                    case "+":
                    stack.push(val1 + val2);
                    break;
                    case "-":
                    stack.push(val1 - val2);
                    break;
                    case "*":
                    stack.push(val1 * val2);
                    break;
                    case "/":
                    stack.push(val1 / val2);
                    break;
                }
            }
        }
        return stack.pop();
    }
    public boolean isOperation(String s){
        if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){
            return true;
        }
        return false;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值