zoukankan      html  css  js  c++  java
  • 数组实现一个简单的栈结构

    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;
        }
    
    
    
    }
  • 相关阅读:
    Coursera公开课-Machine_learing:编程作业4
    C与C艹的内存管理方式
    诡异之--map clear 之后可能导致size != 0的操作
    c++ 四种类型转换机制
    C++ 由虚基类 虚继承 虚函数 到 虚函数表
    dynamic_cast 与 typeid
    Coursera公开课-Machine_learing:编程作业3
    【Leetcode 166】 Fraction to Recurring Decimal
    宏与可变参数
    C语言之内存覆盖
  • 原文地址:https://www.cnblogs.com/yangxiaohui227/p/13606134.html
Copyright © 2011-2022 走看看