逆波兰表达式求值问题-java语言版

240 阅读2分钟

逆波兰表达式求值问题是我们计算机中经常遇到的一类问题,要研究明白这个问题,首先我们得搞清楚什么是逆波 兰表达式?要搞清楚逆波兰表达式,我们得从中缀表达式说起。

中缀表达式: 中缀表达式就是我们平常生活中使用的表达式,例如:1+3*2,2-(1+3)等等,中缀表达式的特点是:二元运算符总 是置于两个操作数中间。

逆波兰表达式(后缀表达式): 逆波兰表达式是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法,后缀表 达式的特点:运算符总是放在跟它相关的操作数之后。

表达式.png

-- 运算思想:

1、创建一个栈用于保存操作数。
2、从左往右遍历。
3、如果是数字直接入栈。
4、如果是运算符,从栈中弹出两个操作数,用当前运算符进行计算,然后将结果压栈。
5、遍历结束后,将栈中的结果弹出返回。

-- 代码:

/**
 * 后缀表达式(逆波兰表达式)运算
 */
public class ReversePolishNotation {
    public static void main(String[] args) {
        //中缀表达式3*(17-15)+18/6的逆波兰表达式如下
        String[] notation = {"3", "17", "15", "-", "*","18", "6","/","+"};
        int result = caculate(notation);
        System.out.println("逆波兰表达式的结果为:"+result);
    }
    /**
     * @param notaion 逆波兰表达式的数组表示方式
     * @return 逆波兰表达式的计算结果
     */
    public static int caculate(String[] notaion){
        // 创建一个栈存储操作数
        Stack<Integer> oprands = new Stack<>();
        // 从左往右遍历逆波兰表达式,得到每一个字符串
        for(int i = 0;i < notaion.length;i++) {
            // 拿出每个字符串
            String curr = notaion[i] ;

            // 判断该字符串是不是运算符,如果不是,把该操作数压入栈中
            Integer o1;
            Integer o2;
            Integer result;
            switch(curr) {
                case "+":
                    // 如果是运算符从栈中弹出两个操作数
                    o1 = oprands.pop();
                    o2 = oprands.pop();
                    // 使用运算符计算该结果
                    result = o2 + o1;
                    // 将结果压入栈中
                    oprands.push(result);
                    break;
                case "-":
                    // 如果是运算符从栈中弹出两个操作数
                    o1 = oprands.pop();
                    o2 = oprands.pop();
                    // 使用运算符计算该结果
                    result = o2 - o1;
                    // 将结果压入栈中
                    oprands.push(result);
                    break;
                case "*":
                    // 如果是运算符从栈中弹出两个操作数
                    o1 = oprands.pop();
                    o2 = oprands.pop();
                    // 使用运算符计算该结果
                    result = o2 * o1;
                    // 将结果压入栈中
                    oprands.push(result);
                    break;
                case "/":
                    // 如果是运算符从栈中弹出两个操作数
                    o1 = oprands.pop();
                    o2 = oprands.pop();
                    // 使用运算符计算该结果
                    result = o2 / o1;
                    // 将结果压入栈中
                    oprands.push(result);
                    break;
                default:
                    // 如果是操作数,直接入栈
                    oprands.push(Integer.parseInt(curr));
                    break;
            }
        }
        // 遍历结束后,拿出栈中的最终结果返回
        return oprands.pop();
    }
}

-- 运行效果图:

逆波兰表达式运行结果.png

@ 以上内容属于个人笔记