后缀表达式求值(逆波兰表达式)--java版本

这篇博客介绍了如何在Java中处理后缀表达式求值和中缀表达式转后缀表达式的过程。通过设置栈进行计算,详细解释了每个步骤,并提供了具体的操作数和运算符的处理示例。最后提到了中缀表达式转换的代码实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该篇中表达式运算(加减乘除 取余 幂运算),包括小数,带有各种英文括号,以及多余符号的去除,有关的原理也可以参照上一篇文章.

中缀表达式求值

一.后缀表达式

(1) 简介:

  又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),使用中缀表达式符合人的思维习惯,但是后缀表达式便于计算机.
  因此,我们将中缀表达式转换为后缀表达式在作计算.

(2) 后缀表达式求值

思路:
 设置一个栈.遍历表达式.

  1. 如果遇到操作数,压入栈中
  2. 如果遇到运算符,从栈顶弹出两个操作符并且做运算,运算结果压入栈中.
  3. 栈中最后留下的数就是最终的结果.

举例: 4 5 * 8 - 60 + 8 2 / +

  1. 操作数压入栈中,因此,4 和 5压入栈中
  2. 遇到运算符*号,从栈中弹出两个操作数,进行运算,结果压入栈中,弹出4和5,结果20压栈.
  3. 遇到8压栈
  4. 遇到 - 号,计算,得到结果 12 压入栈中
  5. 遇到60 压入栈中
  6. 遇到 + 号,计算得到结果72
  7. 8 和 2压入栈中
  8. / ,弹出8 和 2,计算得到4,压入栈中
  9. +, 弹出72 和 4 ,计算,得到76
  10. 最终结果为76
(3) 后缀表达式求值代码实现
  private static float calculate(List<String> s) {
   
       Stack<String> stack = new Stack<>();
       for (String it : s) {
   
       // 如果为操作数,直接入栈
           if (it.matches("[1-9]\\d*\\.?\\d*")) {
   
               stack.push(it);
           } else {
   
           // 如果为运算符,则从栈顶弹出两个操作数,并进行运算,将结果压入栈中
               float num1 = Float.parseFloat(stack.pop());
               float num2 = Float.parseFloat(stack.pop());
               float res = 0;
               switch (it) {
   
                   case "+": {
   
                       res = num1 + num2;
                       break;
                   }
                   case "-": {
   
                       res = num2 - num1;
                       break;
                   }
                   case "*": {
   
                       res = num2 * num1;
                       break;
                   }
                   case "/": {
   
                       res = num2 / num1;
                       break;
                   }
                   case "%": {
   
                       res = num2 % num1;
                       break;
                   }
                   case "^": {
   
                       res = 1;
                       for (int i = 1; i <= num1; i++) {
   
                           res *= num2;
                       }
                       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值