数组实现一个简单的栈结构

public class Stack {
    private int maxSize=16;
    private int top;
    private int[] arr=null;

    public Stack(int maxSize) {
        if(maxSize<1){
            throw new RuntimeException("长度太小");
        }
        this.maxSize = maxSize;
        this.top = -1;
        this.arr = new int[maxSize];
    }
    public boolean isFull(){
        return top==maxSize-1;
    }

    public void  push(int i){
        if(isFull()){
            throw new RuntimeException("栈已满");
        }
        top++;
        arr[top]=i;
    }
    private boolean isEmpty(){
        return top==-1;
    }

    public int pop(){
        if(isEmpty()){
            throw new RuntimeException("数据为空");
        }
        int res=arr[top];
        top--;
        return res;
    }
    public int peek(){
        if(isEmpty()){
            throw new RuntimeException("数据为空");
        }
        return arr[top];
    }

    public static void main(String[] args) {
        Stack stack = new Stack(5);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        System.out.println(stack.peek());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}

 //通过栈实现简单的整数加减乘除的计算

public class Calculator {
    public static void main(String[] args) {
        //中缀表达式   7+2x5-8
        String express = " 7000 + 2 x 5-8/2";
        System.out.println(getNum(express));


    }

    public static  int getNum(String express){
        char[] chars = express.trim().toCharArray();
        Stack number = new Stack(10);
        Stack operate = new Stack(10);
        for (int i = 0; i < chars.length; i++) {
            char c=chars[i];
            if(c==32){ //去除空字符
                continue;
            }
            int num=0;
            if(isNumber(c)){
                int j=getNumLimit(chars,i);
                num= getNum(chars,i,j);
                i=j-1;
            }

            if(isNumber(c)){
                number.push(num);
            }else {
                if(operate.isEmpty()){
                    operate.push(c);
                }else {
                    int peek = operate.peek();
                    if(priority((char) peek)>priority((char) c)){
                        int num1 = number.pop();
                        int num2 = number.pop();
                        int op = operate.pop();
                        int ret = compute(num1, num2, (char) op);
                        number.push(ret);
                        operate.push(c);

                    }else {
                        operate.push(c);
                    }

                }

            }
        }

        while (true){
            if(operate.isEmpty()){
                break;
            }
            int num1 = number.pop();
            int num2 = number.pop();
            int op = operate.pop();
            int ret = compute(num1, num2, (char) op);
            number.push(ret);
        }
        return number.pop();
    }

    public static int getNum(char[] arr,int start,int end){
        String str="";
        for (int i = start; i < end; i++) {
            str+=arr[i];
        }
        return Integer.parseInt(str);

    }

    public static  int getNumLimit(char[] arr,int i){
        int length=arr.length;
        String str="";
        while (true){
            if(i>=length){
                break;
            }
            char c=arr[i];
            if(!isNumber(c)){
                break;
            }
            str+=c;
            i++;
        }
        return i;

    }


    public static boolean isNumber(char c){
        return (c+"").matches("\\d");
    }

    public static  int  priority(char a){
        int i=0;
        switch (a){
            case 'x':
            case '/':
                i=2;
            break;
            case '+':
            case '-':
                i=1;
            break;
            default:
                return -1;
        }
        return i;
    }

    public static  int compute(int num1,int num2,char c){
        int res=0;
        switch (c){
            case '+':
                res=num1+num2;
                break;
            case '-':
                res=num2-num1;
                break;
            case 'x':
                res=num1*num2;
                break;
            case '/':
                res=num2/num1;
                break;
        }
        return res;
    }



}

 

posted @ 2020-09-03 10:16  yangxiaohui227  阅读(183)  评论(0编辑  收藏  举报