波兰计算器和逆波兰计算器

波兰计算器和逆波兰计算器

波兰表达式

  波兰表达式也称前缀表达式,他是运算符写在数字的前边一种表达式。
举个例子,比如一般表达式,也就是前缀表达式 (15 + 4) * 5 - 6

  1. (15 + 4) 的波兰表达式为 +  15  4
  2. (15 + 4) * 5 的波兰表达式为 *  +  15  4  5
  3. (15 + 4) * 5 - 6 的波兰表达式为 -  *  +  15  4  5  6
逆波兰表达式

  逆波兰表达式也称后缀表达式,他是运算符写在数字的后边一种表达式。
还是上面那个例子,(15 + 4) * 5 - 6 来演示一下

  1. (15 + 4) 的波兰表达式为 15  4 +
  2. (15 + 4) * 5 的波兰表达式为 15  4 + 5 *
  3. (15 + 4) * 5 - 6 的波兰表达式为 15  4 + 5 * 6 -
栈模拟波兰计算器和逆波兰计算器要点
  1. 波兰表达式(逆波兰表达式)中每一个数字或运算符之间用逗号隔开,避免分不清两个数字连在一起与多位数混淆。使用一个存放数字的栈即可。
  2. 将波兰表达式(逆波兰表达式)分割到一个数组中,波兰表达式需要后往前遍历数组(逆波兰表达式需要从前往后遍历数组),遇到数字压栈,遇到运算符则计算结果,把结果再入栈。
  3. 最后栈中只剩下一个元素,即最终的结果。
代码
import java.util.Stack;

public class Calculator {
    // 计算波兰表达式
    public static int prefixCount(String pretfixExpression) {
        // 将字符串分割
        String [] strings = pretfixExpression.split(" ");
        Stack<Integer> numStack = new Stack<>(); // 数字栈
        for (int i = strings.length-1; i >= 0; i--) {
            if (isOper(strings[i])) { // 如果是运算符
                int num1 = numStack.pop();
                int num2 = numStack.pop();
                numStack.push(calculate(num2, strings[i], num1));
            } else { // 如果是数字
                numStack.push(Integer.parseInt(strings[i]));
            }
        }
        return numStack.pop();
    }

    // 计算逆波兰表达式
    public static int postfixCount(String postfixExpression) {
        // 将字符串分割
        String [] strings = postfixExpression.split(" ");
        Stack<Integer> numStack = new Stack<>(); // 数字栈
        for (String e : strings) {
            if (isOper(e)) { // 如果是运算符
                int num1 = numStack.pop();
                int num2 = numStack.pop();
                numStack.push(calculate(num1, e, num2));
            } else { // 如果是数字
                numStack.push(Integer.parseInt(e));
            }
        }
        return numStack.pop();
    }

    // 判断是否是运算符
    public static boolean isOper(String val) {
        return val.equals("+") || val.equals("-") || val.equals("*") || val.equals("/");
    }

    // 返回计算结果
    public static int calculate(int num1, String oper, int num2) {
        int res = 0;
        switch (oper) {
            case "+":
                res += num2 + num1;break;
            case "-":
                res += num2 - num1;break;
            case "*":
                res += num2 * num1;break;
            case "/":
                res += num2 / num1;break;
            default:
                break;
        }
        return res;
    }
}

测试一下

public static void main(String[] args) {
    System.out.println("------------------逆波兰表达式-----------------");
    String postfixExpression = "15 4 + 5 * 6 -"; // 89
    System.out.println(postfixExpression + " = " + postfixCount(postfixExpression));
    System.out.println("------------------波兰表达式-----------------");
    String prefixExpression = "- * + 15 4 5 6";  // 89
    System.out.println(prefixExpression + " = " + prefixCount(prefixExpression));
}

运行结果

------------------逆波兰表达式-----------------
15 4 + 5 * 6 - = 89
------------------波兰表达式-----------------
- * + 15 4 5 6 = 89

中缀表达式的计算可看
栈模拟计算器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值