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

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

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

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

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

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

java实现四则运算表达式求值_第1张图片java实现四则运算表达式求值_第2张图片
java实现四则运算表达式求值_第3张图片
java实现四则运算表达式求值_第4张图片
java实现四则运算表达式求值_第5张图片

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

java实现四则运算表达式求值_第6张图片
java实现四则运算表达式求值_第7张图片
java实现四则运算表达式求值_第8张图片
附代码如下

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);
    }
}

测试结果
java实现四则运算表达式求值_第9张图片
参考书籍:《大话数据结构》 程杰 著

你可能感兴趣的:(java实现四则运算表达式求值)