队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列可以由数组实现,也可以由链表实现,下面代码以数组实现队列。
数组实现队列思路:
1)需要两个变量(或者说是指针),指向队列的头部和尾部,队列初始化时都指向为-1(代表指针开始指向队列头部的前一个位置),front为头部,rear为尾部。
2)定义一个数组array和一个maxSize变量,创建数组时用maxSize,这也是用数组实现队列的缺点之一,队列大小有限。
3)怎么判断队列为空?当front==rear
相等时,队列为空。
4)怎么判断队列满了?当rear=maxSize-1
,队列就满了。
5)队列插入元素时,从队尾插入,先判断队列是否满了,如果满了就不插入,未满就插入元素e,先将队尾rear指针向后移一位再插入数据
rear++
array[rear] = e
6)队列取出元素时,从队首取出,先判断队列是否为空,为空就不能取出,不为空就取出队列第一个元素,先将队首指针向后移一位再取出元素
front++
int e = array[front]
return e
具体代码如下:
定义一个队列对象:
class ArrayQueue {
private int maxSize;
private int[] queue;
private int front;
private int rear;
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
queue = new int[maxSize];
front = -1;
rear = -1;
}
}
判空,判断满,打印队列,插入和取出方法:
public Boolean isEmpty(){//当队首和队尾指针相同,即为空
return this.front == this.rear;
}
public Boolean isFull(){
return this.rear == maxSize - 1;
}
public void printQueue(){
for (int i : queue) {
System.out.printf("%3d",i);
}
System.out.println();
}
public void put(int e){
if (this.isFull()){
System.out.println("队列已经满了");
}else {
this.rear++;
queue[rear] = e;
}
}
public int get(){
if (!this.isEmpty()){
this.front++;
int e = queue[front];
queue[front] = 0;
return e;
}else{
return -1;
}
}
以上就用数组实现了队列,但队列只能使用一次,不能重复使用,后续考虑使用链表实现