自己动手写一个简单的队列结构
队列(Queue)是除了数组和栈之外另一个比较简单的数据结构,它的特点跟栈有点区别,它的特点是“先进先出”,如果说栈是一个桶,那么队列就是一个管道,只能从一头添加元素,一头删除元素。
在这个例子中,我们的队列的底层是一个数组,通过两个指针来达到队列的效果,具体的原理如图。
初始化数组和指针
通过两个指针来定义队列中的元素
当指针大于数组长度的时候,则重置为初始化值,从头指针到尾指针之间即是整个队列中的元素。
实现代码如下:
package myQueue;
public class MyQueue {
// 队列的底层结构是一个数组,所以在这里我们定义一个数组
private long[] arr;
// 定义一个表示队列中元素数目的变量
private int elements;
// 定义队列头索引
private int front;
// 定义队列尾索引
private int rear;
/**
* 空参构造
*/
public MyQueue() {
// 默认队列长度为30
arr = new long[30];
// 元素为0
elements = 0;
// 队头为0
front = 0;
// 队尾为-1,表示没有数据
rear = -1;
}
/**
* 有参构造
* @param MaxSize
*/
public MyQueue(int MaxSize) {
// 使用用户传入的参数作为队列长度
arr = new long[MaxSize];
// 队列初始元素,队头,队尾同空参构造
elements = 0;
front = 0;
rear = -1;
}
/**
* 插入元素,只能从队尾插入
* @param value
*/
public void insert(long value) {
// 先判断队尾是否满了
if (!this.isFull()) {
// 这一步是为了循环使用数组的索引,当队尾索引等于数组最大索引时
// 将其重置为-1, 队头和队尾之间的是整个队列
// 这样避免了ArrayIndexOutOfBoundsException
if (rear == arr.length - 1) {
rear = -1;
}
// 插入元素
arr[++rear] = value;
// 元素数目加1
elements++;
}
}
/**
* 从队头删除一个元素并返回
* @return
*/
public long remove() {
// 获取一个瓶子来装即将要删除的元素
long tmp = 0;
// 如果有元素,即队列不是空的
if (elements != 0) {
// 获取要删除的数,并把队头索引+1,+1就是删除了
tmp = arr[front++];
// 如果删除到队尾了,则重置front
if (front == arr.length) {
front = 0;
}
// 删除一个元素,计数-1
elements--;
}
// 返回这个被删除的数
return tmp;
}
/**
* 查询队头的元素
* @return
*/
public long peek() {
return arr[front];
}
/**
* 判断队列是否空
* @return
*/
public boolean isEmpty() {
return elements == 0;
}
/**
* 判断队列是否满了
* @return
*/
public boolean isFull() {
return elements == arr.length;
}
}
测试代码:
package myQueue;
public class TestMyQueue {
public static void main(String[] args) {
MyQueue myQueue = new MyQueue(5);
myQueue.insert(1);
myQueue.insert(2);
myQueue.insert(3);
myQueue.insert(4);
myQueue.insert(5);
myQueue.insert(6);
System.out.println("队列是否满了:"+myQueue.isFull());
System.out.println("删除所有数据:");
for(int i = 1; i <= 5; i++) {
System.out.print(myQueue.remove() + " ");
}
System.out.println();
System.out.println("队列是否为空:"+myQueue.isEmpty());
myQueue.insert(125);
myQueue.insert(102);
System.out.println(myQueue.remove());
System.out.println(myQueue.remove());
}
}
控制台输出
队列是否满了:true
删除所有数据:
1 2 3 4 5
队列是否为空:true
125
102