算法笔记-数组实现栈,队列

  上篇写到了堆排,其实最主要的是使用数组实现堆结构,那么如何使用数组实现栈,队列呢?

  首先我们简单了解栈的数据结构:栈是一种先进后出的结构,如下图可以看到按顺序进入的3->2->5,那么取出的顺序则为5->2->3。

 如果使用数组实现,那就需要记住我最新插入的数是哪个,然后倒推取出,代码如下:

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

        ArrayStack(int initSize){
            if(initSize <= 0) throw new IllegalArgumentException("The init size is less than 0");

            arr = new int[initSize];
        }

        public void push(int a){
            if(size + 1 >arr.length-1 ){
                throw new IllegalArgumentException("The stack is full");
            }
            arr[size++] = a;
        }

        public int pop(){
            if(size -1 < 0){
                throw new IllegalArgumentException("The stack is empty");
            }
            return arr[size--];
        }
    }

代码很简单,就不多说了。

再看看队列,队列和栈不一样,是需要按顺序先进先出的,就像我们食堂排队打饭一样,先到的先打。那么用数组如何实现呢,看代码实现:

public class ArrayQueue{
        private int[] arr;
        private int size;
        private int write;
        private int read;

        ArrayQueue(int initSize){
            if(initSize <= 0) throw new IllegalArgumentException("The init size is less than 0");

            arr = new int[initSize];
        }

        public void push(int a){
            if(size + 1 >arr.length-1 ){
                throw new IllegalArgumentException("The queue is full");
            }
            write  = write+1 >arr.length-1 ? 0 : write+1;
            arr[write] = a;
            size ++;
        }

        public int pop(){
            if(size <= 0){
                throw new IllegalArgumentException("The queue is empty");
            }
            size--;
            int temp = read;
            read = read -1 < 0 ? arr.length-1 : read-1;
            return arr[temp];
        }
    }

这里分别用read来记录取数据的位置,write记录插入数据的位置,数组实现队列有一个复杂的情况就是你取出先进的数据之后,数组前部分就空出来了,所以我们插入到数组最后时,需要回到开头重新插。

  

原文地址:https://www.cnblogs.com/gmt-hao/p/14860683.html