zoukankan      html  css  js  c++  java
  • 06.数组模拟栈-简易计算器

    /**
     *  数组模拟栈-简易计算器
     */
    public class ArrayStackDemo {
        public void calculate(String s){
            //数字栈
            ArrayStack numStack = new ArrayStack(10);
            //符号栈
            ArrayStack operStack = new ArrayStack(10);
            int index = 0;
            char c;
            int res = 0;
            int num1 = 0;
            int num2 = 0;
            String num = "";
            do {
                c = s.substring(index, index + 1).charAt(0);
                //是符号
                if (isOper(c)) {
                    if (operStack.isEmpty()) {
                        operStack.push(c);
                    } else { //符号栈不为空,如果栈中的优先级大就取数字栈的2个进行运算
                        if (priority(c) <= priority(operStack.peek())) {
                            num2 = numStack.pop();
                            num1 = numStack.pop();
                            res = cal(num1, num2, operStack.pop());
                            numStack.push(res);
                            operStack.push(c);
                        } else {
                            operStack.push(c);
                        }
                    }
                } else {
                    num = num + c;
                    if (index == s.length()-1){
                        numStack.push(Integer.parseInt(num));
                    }else if (isOper(s.substring(index+1, index+2).charAt(0))){
                        numStack.push(Integer.parseInt(num));
                        num = "";
                    }
                }
                System.out.print(c);
                index++;
            } while (index < s.length());
    
            while (true){
                if (!operStack.isEmpty()){
                    num2 = numStack.pop();
                    num1 = numStack.pop();
                    res = cal(num1, num2, operStack.pop());
                    numStack.push(res);
                }else {
                    break;
                }
            }
            res = numStack.pop();
            System.out.println("="+res);
    
        }
        // * / + - 运算符优先级
        private int priority(int oper){
            if (oper=='*'||oper=='/'){
                return 1;
            }
            if (oper=='+'||oper=='-'){
                return 0;
            } else {
                return -1;
            }
        }
        // 判断是不是* / + -
        private boolean isOper(int val){
            return val=='+'||val=='-'||val=='*'||val=='/';
        }
        private static int cal(int num1, int num2, int oper){
            int res = 0;
            switch (oper){
                case '+':
                    res = num1 + num2;
                    break;
                case '-':
                    res = num1 - num2;
                    break;
                case '*':
                    res = num1 * num2;
                    break;
                case '/':
                    res = num1 / num2;
                    break;
                default:
                    break;
            }
            return res;
        }
    
        public static void main(String[] args){
    //        ArrayStack stack = new ArrayStack(3);
    //        stack.push(1);
    //        stack.push(2);
    //        stack.push(3);
    //        stack.push(4);
    //        stack.list();
    //        stack.pop();
    //        stack.list();
    //        stack.pop();
    //        stack.pop();
    //        stack.pop();
    
            new ArrayStackDemo().calculate("11+1*1");
            new ArrayStackDemo().calculate("10+11-1");
            new ArrayStackDemo().calculate("10+10/10");
            new ArrayStackDemo().calculate("10+10+10");
    
    
        }
    }
    class ArrayStack{
        private int maxsize;
        private int[] stack;
        private int top = -1;
    
        public ArrayStack(int maxsize) {
            this.maxsize = maxsize;
            stack = new int[maxsize];
        }
        //栈满
        public boolean isFull(){
            return top == maxsize-1;
        }
        //栈空
        public boolean isEmpty(){
            return top == -1;
        }
        //入栈
        public void push(int i){
            if (isFull()){
                System.out.println("栈满~");
                return;
            }
            top++;
            stack[top] = i;
        }
        //出栈
        public int pop(){
            if (isEmpty()){
                System.out.println("栈空~");
                return -1;
            }
            int i = stack[top];
            top--;
            return i;
        }
        public int peek(){
            if (isEmpty()){
                System.out.println("栈空~");
                return -1;
            }
            return stack[top];
        }
        public void list(){
            if (isEmpty()){
                System.out.println("栈空~");
                return;
            }
            for (int i = top; i >= 0; i--) {
                System.out.print("stack["+i+"]="+stack[i]+" ");
            }
            System.out.println();
        }
    }
    
  • 相关阅读:
    手机开发中的AP与BP的概念
    pk8和x509.pem转换成keystore
    android系统release签名
    java读取pfx或P12格式的个人交换库公私钥
    使用IntelliJ IDEA查看类的继承关系图形
    Java日志框架与日志系统
    Java常见加密技术的密钥与加密串长度
    quartz的持久化任务调度使用应用的dataSource
    敏感数据脱敏
    Jquery的Ajax中contentType和dataType的区别
  • 原文地址:https://www.cnblogs.com/fly-book/p/11640317.html
Copyright © 2011-2022 走看看