欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法之路_17、用数组结构实现大小固定的队列和栈

程序员文章站 2022-07-14 14:19:32
...

题目:用数组结构实现大小固定的队列和栈

一、数组实现栈结构:

        栈结构是先进后出的,只需要一个数组和一个记录位置的变量size,当进来一个元素,size就++,出去一个元素size就--

 

public class ArrayStack{
        private Integer[] arr;
        private Integer   size;

        /**
         *  栈初始化
         * @param initSize 初始化数组容量
         */
        public ArrayStack(int initSize){
            if (initSize<0)
                throw  new  IllegalArgumentException("参数不合理!");
            arr=new Integer[initSize];
            size=0;
        }

        /**
         * @Description: 返回栈顶元素
         * @return:  栈空 返回null 栈不空 返回栈顶元素
         * @date: 2019/4/23 10:12
         */
        public Integer peek(){
            if (size==0)
                return null;
            Integer num = arr[size - 1];
            return num;
        }

        /**
         * @Description: 压栈操作
         * @param:    待压入元素
         * @date: 2019/4/23 10:15
         * @throws:  栈满时,抛出数组越界异常
         */
        public void push(int obj){
            if (size==arr.length)
                throw new ArrayIndexOutOfBoundsException("栈满,无法压入!");
            arr[size++]=obj;
        }

        /**
         * @Description: 弹栈操作
         * @return:  返回栈顶元素 并数量减一
         * @date: 2019/4/23 10:19
         * @throws :  栈空时抛出数组越界异常
         */
        public Integer pop(){
            if (size==0)
                throw new ArrayIndexOutOfBoundsException("栈空,无法弹栈!");
            return arr[--size];
        }
    }

二、.实现队列结构:相对栈结构麻烦一些,队列要求先进先出,本案例中设置一个数组和三个变量,size用于记录元素总数,last记录刚进来的元素应该放在哪个位置即队尾,first表示用户要求弹出的元素所在的位置即队首。或许有些同学会觉得size是多余的,完全可以不要。但是size的作用并不仅仅是记录总数,它还有一个作用是使得last与first解耦,避免在一些代码中的一些麻烦。

public class Code_01_Array_To_Stack_Queue {

    public static class ArrayStack{
        private Integer[] arr;
        private Integer   size;

        /**
         *  栈初始化
         * @param initSize 初始化数组容量
         */
        public ArrayStack(int initSize){
            if (initSize<0)
                throw  new  IllegalArgumentException("参数不合理!");
            arr=new Integer[initSize];
            size=0;
        }

        /**
         * @Description: 返回栈顶元素
         * @return:  栈空 返回null 栈不空 返回栈顶元素
         * @date: 2019/4/23 10:12
         */
        public Integer peek(){
            if (size==0)
                return null;
            Integer num = arr[size - 1];
            return num;
        }

        /**
         * @Description: 压栈操作
         * @param:    待压入元素
         * @date: 2019/4/23 10:15
         * @throws:  栈满时,抛出数组越界异常
         */
        public void push(int obj){
            if (size==arr.length)
                throw new ArrayIndexOutOfBoundsException("栈满,无法压入!");
            arr[size++]=obj;
        }

        /**
         * @Description: 弹栈操作
         * @return:  返回栈顶元素 并数量减一
         * @date: 2019/4/23 10:19
         * @throws :  栈空时抛出数组越界异常
         */
        public Integer pop(){
            if (size==0)
                throw new ArrayIndexOutOfBoundsException("栈空,无法弹栈!");
            return arr[--size];
        }
    }

    public static class ArrayQueue{
        private Integer[] arr;
        private Integer size;
        private Integer first;
        private Integer last;

        public ArrayQueue(int arrSize){
            if (arrSize==0)
                throw new IllegalArgumentException("参数非法!");
            arr = new Integer[arrSize];
            size=0;
            first=last=0;
        }
        /**
         * @Description: 返回队首元素
        */
        public Integer peek(){
            if (size==0)
                return null;
            return arr[first];
        }

        public void push(int obj){
            if (size==arr.length)
                throw new ArrayIndexOutOfBoundsException("队满!");
            size++;
            arr[last]=obj;
            last= last==arr.length-1 ? 0 : last+1;
        }

        public Integer poll(){
            if (size==0)
                throw  new ArrayIndexOutOfBoundsException("队空!");
            size--;
            int temp=first;
            first = first == arr.length-1 ? 0 : first+1;
            return  arr[temp];
        }

    }