上篇写到了堆排,其实最主要的是使用数组实现堆结构,那么如何使用数组实现栈,队列呢?
首先我们简单了解栈的数据结构:栈是一种先进后出的结构,如下图可以看到按顺序进入的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记录插入数据的位置,数组实现队列有一个复杂的情况就是你取出先进的数据之后,数组前部分就空出来了,所以我们插入到数组最后时,需要回到开头重新插。