栈实现综合计算器

package com.dai.stack;

public class Calculator {

    public static void main(String[] args) {
        //完成表达式的运算
        String expression = "103+2*6-6-6";
        //创建数栈和符号栈
        ArrayStack2 numStack = new ArrayStack2(10);
        ArrayStack2 operStack = new ArrayStack2(10);
        int index = 0; 
        int num1 = 0;
        int num2 = 0;
        int oper = 0;
        int res = 0;
        char ch = ' ';
        String keepNum = ""; //拼接多位数
        //开始用while循环扫描expression
        while(true) {
            ch = expression.substring(index, index+1).charAt(0);
            //判断ch是什么,再做相应处理
            if(operStack.isOper(ch)) {
                //判断当前符号栈是否空
                if(!operStack.isEmpty()) {
                    if(operStack.priority(ch) <= operStack.priority(operStack.peek())) {
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        oper = operStack.pop();
                        res = numStack.cal(num1, num2, oper);
                        //运算结果入数栈
                        numStack.push(res);
                        //当前操作符入符号栈
                        operStack.push(ch);
                    }
                    else {
                        operStack.push(ch);
                    }
                }else {
                    operStack.push(ch);
                }
            }
            else {
                //处理多位数时,不能直接入栈,向右看一位是否为符号
                keepNum += ch;
                if(index == expression.length()-1) {
                    numStack.push(Integer.parseInt(keepNum));
                }else {
                    
                
                    if(operStack.isOper(expression.substring(index+1, index+2).charAt(0))) {
                        numStack.push(Integer.parseInt(keepNum));
                        keepNum = "";
                    }
                }
            }
            //index +1 是否扫描到最后
            index++;
            if(index>=expression.length()) {
                break;
            }
        }
        while(true) {
            //如果符号栈为空,则计算到最后的结果,数栈中只有一个数字
            if(operStack.isEmpty()) {
                break;
            }
            num1 = numStack.pop();
            num2 = numStack.pop();
            oper = operStack.pop();
            res = numStack.cal(num1, num2, oper);
            numStack.push(res);
        }
        
        System.out.printf("表达式%s = %d
", expression, numStack.pop());
    }

}

//先创建一个栈
class ArrayStack2{
    private int maxSzie;
    private int[] stack; //数组模拟栈,数据放在这
    private int top = -1; //表示栈顶,初始化为-1
    
    public ArrayStack2(int maxSize) {
        this.maxSzie = maxSize;
        stack = new int[this.maxSzie];
    }
    //栈满
    public boolean isFull() {
        return top==maxSzie-1;
    }
    //栈空
    public boolean isEmpty() {
        return top == -1;
    }
    //入栈 - push
    public void push(int value) {
        if(isFull()) {
            System.out.println("栈满了");
            return;
        }
        top++;
        stack[top] = value;
    }
    //出栈
    public int pop() {
        if(isEmpty()) {
            throw new RuntimeException("栈空,无数据");
        }
        int value = stack[top];
        top--;
        return value;
    }
    //返回栈顶元素
    public int peek() {
        return stack[top];
    }
    //遍历栈,遍历时需要从栈顶开始显示数据
    public void list() {
        if(isEmpty()) {
            System.out.println("栈空,没有数据");
            return;  
        }
        for(int i=top; i>=0; i--) {
            System.out.printf("stack[%d] = %d
", i, stack[i]);
        }
    }
    //优先级
    public int priority(int oper) {
        if(oper=='*'||oper=='/')
            return 1;
        if(oper=='+' || oper=='-')
            return 0;
        else 
            return -1;
    }
    //判断是不是运算符
    public boolean isOper(char val) {
        return val=='+'||val=='-'||val=='*'||val=='/';
    }
    
    //计算方法
    public int cal(int num1, int num2, int oper) {
        int res = 0;
        switch (oper) {
        case '+':
            res=  num1+num2;
            break;
        case '-':
            res = num2-num1;
            break;
        case '*':
            res = num1*num2;
            break;
        case '/':
            res = num2/num1;
            break;
        default:
            break;
        }
        return res;
    }

}
原文地址:https://www.cnblogs.com/shengtudai/p/14364381.html