双栈算术表达式求值算法

双栈算术表达式求值算法



栈是一种基于先进后出策略(LIFO)的集合类型。

算术表达式
例如 ( 1 + ( 5 - 2 ) * ( 6 + 3 ) )

算法要求描述
要求输入算术表达式字符串,每个字符和数字之间用 空格(space) 间隔开, 程序输出 表达式的值。(简单起见,暂且仅实现 加减乘除,并且不省略括号 )

思路

  1. 首先我们需要两个栈:operator(用于存放操作符)、 number(用于存放操作数)
  2. 忽略左括号
  3. 遇到操作符,将其压入operator栈
  4. 遇到操作数,将其压入number栈
  5. 遇到右括号,弹出一个操作符,弹出两个操作数,根据操作符和操作数计算出结果,并且将其压入number栈

该算法看似比较繁琐,其实不然。每当遇到一个右括号时,这就意味着遇到了一个子表达式,由栈的先进后出特性,可以分析到:operator栈顶元素就是该子表达式的操作符,number栈中顶端两个元素就是该子表达式的两个操作数,这样,我们就可以将操作符和两个操作数弹出,计算出其结果,该结果就可以代替该子表达式,作为一个操作数压入number栈。直到最后一个右括号出现,最终number栈中只有一个元素,也就是我们想要的表达式的值。


代码实现

import java.util.Scanner;
import java.util.Stack;

public class MainClass {

    public static double expressionCaculate(String str){
        //存放操作符的栈
        Stack<String> opr = new Stack<String>();
        //存放操作数的栈
        Stack<Double> number = new Stack<Double>();

        String[] list = str.split(" ");
        for (String s : list) {
            if(s.equals("(")){
                continue;
            }else if(s.equals("+")){
                opr.push(s);
            }else if(s.equals("-")){
                opr.push(s);
            }else if(s.equals("*")){
                opr.push(s);
            }else if(s.equals("/")){
                opr.push(s);
            }else if(s.equals(")")){
                String op = opr.pop();
                double val = number.pop();
                switch(op){
                case "+":
                    val = number.pop() + val;
                    break;
                case "-":
                    val = number.pop() - val;
                    break;
                case "*":
                    val = number.pop() * val;
                    break;
                case "/":
                    val = number.pop() / val;
                    break;
                }

                number.push(val);

            }else{
                number.push(Double.parseDouble(s));
            }
        }
        return number.pop();
    }


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        System.out.println(str + " = " + expressionCaculate(str));
    }

}

感谢阅读

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值