数据结构-栈-表达式运算

表达式运算实现:

1.栈实现

public class ExpressCalc {

    public static void main(String[] args) {
        /*
        使用栈实现一个0-9整数带括号的表达式计算
        处理步骤:
        1.创建两个栈,一个符号栈(左括号、右括号、加、减、乘、除),左括号优先级最高,右括号优先级最低,一个数字栈(0-9)
        2.遇到数字:直接入数字栈
        3.遇到符号:
            如果符号栈为空,则直接入符号栈
            如果当前符号优先级 > 栈顶符号优先级:直接入符号栈
            如果当前符号优先级 <= 栈顶符号优先级:将数字栈与符号栈元素弹出,进行运算,直到栈为空或者当前符号优先级 > 栈顶符号优先级为止
        */
        String[] expressArray = {
            "2+3*(1+2*4)-3*5",
            "2+3",
            "2+3+(3*4/2)-1",
            "2+3+(3*4/2+5)-1",
            "2+3+(3*4/2+5-9)-1",
            "2+3+(3*4/2+5-9)-1+2*(1+2)",
            "2",
        };

        for (String expressStr : expressArray) {
            int num = calcExpress(expressStr);
            System.out.println(expressStr + "=" + num);
        }
    }

    private static int calcExpress(String expressStr) {

        Stack<Integer> numSt = new Stack<>();
        Stack<Character> symbolSt = new Stack<>();

        char[] cs = expressStr.toCharArray();
        for (int i = 0; i < cs.length; i++) {
            // 匹配数字
            if(String.valueOf(cs[i]).matches("\\d")){
                numSt.add(cs[i] - '0');
            }else if(cs[i] == '+' || cs[i] == '-' || cs[i] == '*' || cs[i] == '/' || cs[i] == '(' || cs[i] == ')'){
                if(symbolSt.isEmpty() || priority(cs[i], symbolSt.peek())){
                    symbolSt.add(cs[i]);
                }else{
                    while(!symbolSt.isEmpty() && symbolSt.peek() != '(' && !priority(cs[i], symbolSt.peek())){
                        Integer n1 = numSt.pop();
                        Integer n2 = numSt.pop();
                        int res = calc(n2, n1, symbolSt.pop());
                        numSt.add(res);
                    }
                    if(!symbolSt.isEmpty() && symbolSt.peek() == '(') symbolSt.pop();
                    if(cs[i] != ')') symbolSt.add(cs[i]);
                }
            }
        }

        while(!symbolSt.isEmpty()){
            Integer n1 = numSt.pop();
            Integer n2 = numSt.pop();
            int res = calc(n2, n1, symbolSt.pop());
            numSt.add(res);
        }
        return numSt.pop();
    }

    // 优先级判断 a > b : 返回true,否则返回false
    public static boolean priority(char a, char b){
        if(a == '(') return true;
        if((a == '*' || a == '/') && (b == '+' || b == '-' || b == ')')) return true;
        if((a == '+' || a == '-') && b == ')') return true;
        return false;
    }

    public static int calc(int a, int b, char express){
        switch (express){
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
            default:
                throw new RuntimeException("不支持" + express + "进行运算");
        }
    }
}

2.中缀表达式转后缀表达式计算

https://blog.csdn.net/Linging_24/article/details/104481492

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值