队列
队列是一种特殊的
线性表
,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。——来源于百度百科
在队列中第一个被插入的数据项也会第一个被移除(先进先出(FIFO)),理解:现实生活中的排队,排在第一个的总是第一个离开。
应用:模拟现实生活中类似银行排队等待,飞机起飞等待,网络数据包等待传送等;
循环队列理解:队列在数组中实现时当删除或插入数据时数据项时不会移动的,它是通过指针来记录第一个插入和最后一个插入的元素的位置来实现队首和队尾的。
代码实现:
package net.hncu.d0731;
public class QueueModel {
private int maxSize;//空间
private Object[] o;
private int front;//队首指针
private int rear;//队尾指针
QueueModel(int maxSize){
//给数组多开辟一个空间是为了判断栈为空和栈满front和rear值相同的情况
this.maxSize=maxSize+1;
o=new Object[this.maxSize];
front=0;
rear=-1;
}
public void insert(Object j) {
//如果队尾到了最大值,则重新调到初始位置
if(rear==maxSize-1) {
rear=-1;
}
o[++rear]=j;
}
public Object remove() {
//同样如果队首到了最大值也重新调到初始位置
Object temp = o[front++];
if(front==maxSize)
front=0;
return temp;
}
public Object peek() {
return o[front];
}
public boolean isFull() {
return (rear+2==front||front+maxSize-2==rear);
}
public boolean isEmpty() {
return (rear+1==front||front+maxSize-1==rear);
}
public int size() {
if(rear>=front)
return rear-front+1;
else
return (maxSize-front)+(rear+1);
}
}