java实现四则运算表达式求值

先来个例子 9+(3-1)×3+10÷2,最重要的就是两步

①将中缀表达式转化为后缀表达式
②将后缀表达式进行运算得出结果

那么什么是中缀和后缀表达式呢?

中缀表达式就是"9+(3-1)×3+10÷2",相对应的后缀表达式是"9 3 1 - 3 * + 10 2 /",叫后缀的原因在于所有的符号都是要在运算数字的后面出现,而且没有括号,这样的表述对于我们来说是很难受的,但我们聪明的计算机喜欢。

1.将中缀表达式转化为后缀表达式

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.将后缀表达式进行运算得出结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
附代码如下

import java.util.Stack;

public class Calculator {
    public static int priority(char a) {//判断符号优先级
        switch (a) {
            case '+':
            case '-':
            case '(':
                return 1;
            case '*':
            case '/':
                return 2;
        }
        return 0;
    }

    public static char[] middleToBack(String exp) {//中缀表达式转后缀表达式
        Stack<Character> stack = new Stack();//栈用来进出运算的符号
        char[] arr = exp.toCharArray();
        char[] brr = new char[arr.length * 2];//保存后缀表达式,需在数字和符号之间加空格区分,因此长度定为arr的2倍
        int count = 0;//标记brr

        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {//防止越界
                brr[count++] = arr[i];
                brr[count++] = ' ';
            } else if ((arr[i] >= '0' && arr[i] <= '9') && !(arr[i + 1] >= '0' && arr[i + 1] <= '9')) {
                brr[count++] = arr[i];
                brr[count++] = ' ';
            } else if (arr[i] >= '0' && arr[i] <= '9') {
                brr[count++] = arr[i];
            } else {//符号
                if (stack.isEmpty()) {
                    stack.push(arr[i]);
                } else if (arr[i] == '(') {
                    stack.push(arr[i]);
                } else if (arr[i] == ')') {
                    while (stack.peek() != '(') {//'('与')'之间的符号出栈
                        brr[count++] = stack.peek();
                        brr[count++] = ' ';
                        stack.pop();
                    }
                    stack.pop();//将'('出栈
                } else if (priority(arr[i]) >= priority(stack.peek())) {//如果优先级高于或等于栈顶元素,直接入栈
                    stack.push(arr[i]);
                } else if (priority(arr[i]) < priority(stack.peek())) {//如果优先级低于栈顶元素,依次出栈
                    while (!stack.isEmpty()) {
                        brr[count++] = stack.peek();
                        brr[count++] = ' ';
                        stack.pop();
                    }
                    stack.push(arr[i]);
                }
            }
        }
        while (!stack.empty()) {
            brr[count++] = stack.peek();
            brr[count++] = ' ';
            stack.pop();
        }
        System.out.print(brr);
        System.out.println();
        return brr;
    }

    public static void calculate(char[] brr) {//后缀表达式求得计算结果
        Stack<Integer> stack = new Stack();//栈用来进出运算的数字
        for (int i = 0; i < brr.length; ) {
            String number = "";
            if (brr[i] == ' '||brr[i]=='\0') {//空格或为空
                i++;
                continue;
            }
            if (brr[i] >= '0' && brr[i] <= '9') {//数字入栈
                while (brr[i] >= '0' && brr[i] <= '9') {
                    number += brr[i];
                    i++;
                }
                stack.push(Integer.valueOf(number));//字符型转整型入栈
            } else if(brr[i]=='+'||brr[i]=='-'||brr[i]=='*'||brr[i]=='/') {//符号
                int top1 = stack.peek();
                stack.pop();
                int top2 = stack.peek();
                stack.pop();
                int result = operate(top2,top1,brr[i]);//注意top2和top1的位置
                stack.push(result);
                i++;
            }
        }
        System.out.println(stack.peek());
    }

    public static int operate(int item1, int item2, char operator) {
        int result = 0;
        switch (operator) {
            case '+':
                result = item1 + item2;
                break;
            case '-':
                result = item1 - item2;
                break;
            case '*':
                result = item1 * item2;
                break;
            case '/':
                result = item1 / item2;
                break;
        }
        return result;
    }

    public static void main(String[] args) {
        String exp = "9+(3-1)*3+10/2";
        char[] brr = middleToBack(exp);
        calculate(brr);
    }
}

测试结果
在这里插入图片描述
参考书籍:《大话数据结构》 程杰 著

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值