java用栈实现计算器完整版

java用栈实现计算器完整版

栈类

class Stack {
    private int maxSize;
    private int[] stack;
    private int top = -1;

    public Stack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[maxSize];
    }

    // 返回栈顶元素
    public int peek() {
        return stack[top];
    }

    public void show() {
        if (isEmpty()) {
            System.out.println("栈空的");
            return;
        }
        for (int i = top; i >= 0; --i) {
            System.out.println("stack[" + i + "] ==> " + stack[i]);
        }
    }

    public void push(int value) {
        if (isFull()) {
            System.out.println("栈满了");
            return;
        }
        // 插入数据
        stack[++top] = value;
    }

    public Integer pop() {
        if (isEmpty()) {
            System.out.println("栈是空的");
            return null;
        }
        // pop
        return stack[top--];
    }

    public boolean isFull() {
        return (top == maxSize - 1);
    }

    public boolean isEmpty() {
        return (top == -1);
    }

    /**
     * 运算符优先级判断
     */
    public int priority(int opera) {
        int priority = -1;
        char[] operas = {'*', '/', '+', '-'};
        if (opera == operas[0] || opera == operas[1]) {
            priority = 1;
        } else if (opera == operas[2] || opera == operas[3]) {
            priority = 0;
        }
        return priority;
    }

    /**
     * 判断是不是一个运算符
     */
    public boolean isOpera(char val) {
        return ((val == '+') || (val == '-') || (val == '*') || (val == '/'));
    }

    public int cal(int num1, int num2, int opera) {
        int result = 0;
        switch (opera) {
            case '*':
                result = num1 * num2;
                break;
            case '/':
                result = num2 / num1;
                break;
            case '+':
                result = num1 + num2;
                break;
            case '-':
                result = num2 - num1;
                break;
            default:
                break;
        }
        return result;
    }
}

测试类

public class CalculatorDemo {
    public static void main(String[] args) {
        String expression = "700+20*6-4";
        // 创建两个栈
        Stack numStack = new Stack(10);
        Stack operaStack = new Stack(10);

        int index = 0;
        int num1;
        int num2;
        int oper;
        int result;
        char ch;
        StringBuilder keepNum = new StringBuilder();
        // 扫描
        while (true) {
            ch = expression.substring(index, index + 1).charAt(0);
            // 判断扫描的是什么
            // 如果是符号
            if (operaStack.isOpera(ch)) {
                // 判断符号栈里有没有元素
                if (!operaStack.isEmpty()) {
                    // 处理
                    // 拿到栈顶和新元素的优先级
                    int topPriority = operaStack.priority(operaStack.peek());
                    int chPriority = operaStack.priority(ch);
                    // 比较
                    if (chPriority < topPriority) {
                        // 如果优先级小于栈顶
                        // 先计算栈顶也就是
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        oper = operaStack.pop();

                        result = operaStack.cal(num1, num2, oper);
                        // 运算后把结果入数栈
                        numStack.push(result);
                        operaStack.push(ch);
                        keepNum.delete(0, keepNum.length());

                    } else {
                        // 如果小于直接入栈
                        operaStack.push(ch);
                    }
                } else {
                    // 直接入栈
                    operaStack.push(ch);
                }
            } else {
                // 如果是数字,直接入数栈,但是考虑到编码问题,char转int会增加48
                // 此时考虑多位数
                keepNum.append(ch);
                // 如果ch是expression的最后一位
                if (expression.length() - 1 == index) {
                    // 此时直接入栈
                    numStack.push(Integer.parseInt(keepNum.toString()));
                } else {
                    // 判断下一个字符是不是符号
                    if (operaStack.isOpera(expression.substring(index + 1, index + 2).charAt(0))) {
                        //  下一位是运算符时push
                        numStack.push(Integer.parseInt(keepNum.toString()));
                        // 清空keepNum
                        keepNum.delete(0, keepNum.length());
                    }
                }
            }
            // index右移并判断结束
            if (++index >= expression.length()) {
                break;
            }
        }
        // 循环运行完毕,顺序的从两个栈中取对应的元素进行运算
        while (true) {
            if (operaStack.isEmpty()) {
                break;
            }
            num1 = numStack.pop();
            num2 = numStack.pop();
            oper = operaStack.pop();

            result = operaStack.cal(num1, num2, oper);
            // 运算后把结果入数栈
            numStack.push(result);
        }
        // 结束
        System.out.println("表达式" + expression + "的结果是 ==> " + numStack.pop());
    }
}
posted @ 2022-03-28 12:48  CoderCatIce  阅读(382)  评论(0编辑  收藏  举报