后缀逆波兰表达式计算器

使用条件,每个数字或者运算符,必须使用空格隔开

只允许加减乘除简单运算,不支持,小数点,未加入小括号等运算规则 

前置知识:

  /**
     * 完成对逆波兰表达式的运算
     * 1. 从左到右扫描,将 3 和 4 压入栈中
     * 2. 遇到 + 运算符,依次弹出 4 和 3 (栈顶元素,3为次栈顶元素) ,
     * 计算出3 + 4 的值,得到7 再将其压入栈中
     * 3. 将 5 入栈;
     * 4. 接下来是 * 运算符,因此弹出 5 和 7 ,计算出结果 ,将 35 压入栈中
     * 5. 将 6 入栈
     * 6. 最后是 - 运算符,计算出 35 - 6 的值,即 29 , 由此得出最终结果
     */

将得到的表达式通过空格分割,然后存入List集合中: 

    // 将一个逆波兰表达式,依次将数据和运算发放入到ArrayList中
    public static List getListString(String suffixExpression) {
        //将suffixExpression 分割
        String[] split = suffixExpression.split(" "); //截取字符串,以字符串为截取符
        List list = new ArrayList();
        //将元素存入到list集合中
        for (String ele : split) {
            list.add(ele);
        }
        return list;
    }

运算方法:

    public static int cal(List list) {
        //创建一个栈
        Stack stack = new Stack();
        int res = 0;
        //遍历 list
        for (String s : list) {
            //这里使用正则表达式取出来数
            if (s.matches("\\d+")) {//如果是多个数字,直接入栈
                stack.push(s);
            } else {
                //如果取出的不是数字,需要弹出两个数字,进行运算,将运算结果,继续入栈操作
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                if (s.equals("+")) {
                    res = num1 + num2;
                } else if (s.equals("-")) {
                    res = num1 - num2;
                } else if (s.equals("*")) {
                    res = num1 * num2;
                } else if (s.equals("/")) {
                    res = num1 / num2;
                } else {
                    throw  new RuntimeException("您输入的运算符有误!");
                }
                stack.push("" + res);
            }
        }
        return Integer.parseInt(stack.pop());
    }

测试代码类:

    public static void main(String[] args) {
        //先定义逆波兰表达式
        //(3+4)*5-6 ==> 3 4 + 5 * 6 -
        //说明为了方便,逆波兰表达式的 数字和字符使用空格隔开
        String suffixExpression = "3 4 + 5 * 6 - ";
        /** 思路
         *  1. 先将 " 3 4 + 5 * 6 - " => 放到ArrayList中
         *  2. 将ArrayList 传递给一个方法,遍历ArrayList 配合栈 完成计算
         */
        List list = getListString(suffixExpression);
        System.out.println("运算表达式为:" + list);

        //现在进行运算
        System.out.println(list + " = " + cal(list));
    }

 运算结果:

后缀逆波兰表达式计算器_第1张图片

你可能感兴趣的:(数据结构,windows)