逆波兰计算器分析和实现

  1. 简介
    前缀表达式也叫波兰表达式。后缀表达式也叫逆波兰表达式。

  2. 逆波兰表达式实现计算器:

    package com.njcx.test3;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    
    public class PolandNotation {
    
        /**
         * 逆波兰计算器 1.输入一个逆波兰表达式(后缀表达式),使用栈(stack),计算其结果 2.支持小括号和多位数
         * 
         * 从左到右扫描表达式,遇到数字,就把数字压入堆栈。 遇到运算符,弹出栈顶的两个数,用运算符对他们做相应的计算(次顶元素和栈顶元素),并将结果入栈。
         * 重复上述步骤直到表达式最右端,最后运算得出的值即为表达式的结果。
         */
        public static void main(String[] args) {
            // 先定义一个逆波兰表达式 (3+4)*5-6 -> 3 4 + 5 * 6 -
            String suffixExpression = "3 4 + 5 * 6 -";
            // 为了方便,逆波兰表达式中数字和符号用空格隔开
            // 思路
            // 1.先将suffixExpression放到arrayList中
            // 2.将ArrayList传给一个方法,遍历ArrayList配合栈完成计算
            List<String> rpnList = getListString(suffixExpression);
            System.out.println("rpnList = " + rpnList);
    
            int res = calculate(rpnList);
            System.out.println("计算结果是=" + res);
        }
    
        // 依次将一个逆波兰表达式的数据和运算符放入到ArrayList中,这样就不需要设置一个索引一个一个扫描这个表达式了
        public static List<String> getListString(String suffixExpression) {
            // 将suffixExpression分割
            String[] split = suffixExpression.split(" ");
            List<String> list = new ArrayList<String>();
            for (String elem : split) {
                list.add(elem);
            }
            return list;
        }
    
        // 完成对逆波兰表达式的步骤
        /**
         * 从左到右扫描表达式,遇到数字,就把数字压入堆栈。 遇到运算符,弹出栈顶的两个数, 用运算符对他们做相应的计算(次顶元素和栈顶元素),并将结果入栈。
         * 重复上述步骤直到表达式最右端,最后运算得出的值即为表达式的结果。
         */
        public static int calculate(List<String> list) {
            // 创建栈,只需要一个栈即可
            Stack<String> stack = new Stack<String>();
            // 遍历list
            for (String item : list) {
                // 这里使用一个正则表达式来取到数
                if (item.matches("\\d+")) { // 匹配的是多位数
                    // 入栈
                    stack.push(item);
                } else {
                    // pop出两个数并运算再入栈
                    int num2 = Integer.parseInt(stack.pop());// 栈顶元素
                    int num1 = Integer.parseInt(stack.pop());// 次顶元素
                    int res = 0;
                    if (item.equals("+")) {
                        res = num1 + num2;
                    } else if (item.equals("-")) {
                        res = num1 - num2;// 后弹的数-先弹的数
                    } else if (item.equals("*")) {
                        res = num1 * num2;
                    } else if (item.equals("/")) {
                        res = num1 / num2;
                    } else {
                        throw new RuntimeException("运算符无法识别");
                    }
                    // 把运算结果入栈
                    stack.push("" + res);// 把整数转字符串的操作
                }
            }
            // 最后留在栈里的就是我们的计算结果
            return Integer.parseInt(stack.pop());
        }
    
    }

    转载于:https://www.cnblogs.com/isayruby/p/13708028.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值