1.导引
操作系统:当电脑卡逼时候,你不停点击,还是卡死,最后终于电脑又好了以后,操作系统会把执行卡死状态时候你点击的所有操作按照顺序一次执行一遍,
客服系统:按照拨电话的顺序服务,
点小姐,也得按照先来后到的顺序
2.定义:
队列是一种只允许在一段进行插入,另一端进行删除的线性表
队列是一种先进先出(First in first out)的线性表,简称FIFO,允许插入的一端称为队尾,允许删除的一端称为队首,如图,这也比较符合生活中常见的理解
3.队列的两种存储结构的实现
1).队列的顺序存储结构实现
队列的顺序存储结构存在不足:
a.插入的时间复杂度是0(1),删除的时间复杂度是O(n),因为删除时候所有的元素都需要向前移动一位
b.顺序结构在插入的时候,假如想时间复杂度降成O(1),想删除的时候后面元素不用都向前移动,这样又可能出现内存假溢出的情况;
2.循环队列
由上面假溢出的现象引出循环队列的概念,当后面满了以后,从头开始,也就是头尾相接的循环,我们把队列的这种头尾相接的循环结构成为循环队列
3.Java使用顺序存储实现队列
//java实现循环队列,需要注意的是循环队列底层容器不能全满,当队列满时,数组中还有一个空闲单元
public class CycleQueue {
int array[];
int front;//头部指向
int rear;//尾部指向
int queueSize = 5;
public CycleQueue() {
array = new int[queueSize];
front = rear = 0;
}
@Override
public String toString() {
return "CycleQueue [font=" + front + ", rear=" + rear + ", arr=" + Arrays.toString(array) + "]";
}
/**
* 取模是为了将rail和front两种情况都放在一起考虑,不管是谁在前还是谁在后
*
* @return
*/
public int queueLength() {
return (rear - front + queueSize) % queueSize;
}
/**
* 判空:假如rail == front,那么此时是空
*
* @return
*/
public boolean isEmpty() {
return front == rear ? true : false;
}
/**
* 判满函数:
*
* @return
*/
public boolean isFull() {
return (rear + 1) % queueSize == front ? true : false;
}
/**
* 先判断队列是否已满,用取模运算,插入的时候只能插在队列的队尾,
*
* @param element
* @return
*/
public boolean addQueue(int element) {
if (isFull()) {
System.out.println("队列满");
return false;
}
array[rear] = element;
rear = (rear + 1) % queueSize;
return true;
}
/**
* 队列,只能从队首开始删除
*
* @return
*/
public boolean deleteQueue() {
if (isEmpty()) {
System.out.println("队列为空");
return false;
}
array[front] = 0;
front = (front + 1) % queueSize;
return true;
}
/**
* 获取队列首元素
*
* @return
*/
public Object getHead() {
return array[front];
}
public static void main(String[] args) {
CycleQueue queue = new CycleQueue();
queue.addQueue(1);
queue.addQueue(2);
queue.addQueue(3);
// queue.addQueue(4);
// queue.addQueue(5);
System.out.println(queue.toString());
queue.deleteQueue();
System.out.println(queue.toString());
queue.deleteQueue();
System.out.println(queue.toString());
queue.addQueue(5);
System.out.println(queue.toString());
queue.addQueue(6);
System.out.println(queue.toString());
// queue.addQueue(7);
System.out.println("jieduan"+queue.toString());
System.out.println(queue.getHead());
}
}