队列的简述
- 队列是一种数据结构,有点类似于栈,只是在队列中第一个插入的数据项会最先被移除,而在栈中,最后插入的数据项最先被移除,队列的作用就像电影院前的人们站成排的一样,第一个进入队尾的人最先拿到票,最后的人最后才能买到票
- 如图
- 在计算机的操作系统里,有各种队列在安静的工作着,打印作业在打印队列中等待订单,当键盘敲击时,也有一个存储建入内容的队列,同样,使用文字处理程序敲击一个键,而计算机又要暂时去做其他要做的事,但是敲击的内容不会丢失,它会排在队列中等待,直到文字处理程序有时间来读取它,利用队列辩证了键入内容在处理时其顺序不会改变。
如
但是会发现当移除队列中的数据后,队列中的数据项不会总从数组的0处下标开始,移除了一些数据项后,对头的指针会指向一个较高的下标位置
如
所以当为了避免这种问题就有了循环队列
循环式处理
- 为了避免队列不满却不能插入新数据项的问题,可以让队头队尾指正绕回到数组的开始位置,这就是循环队列,用两个图就可以看得很清楚
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f5c1c1581dbd27775f3f67027b530c44.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c6f5e374bf385e2bb656485bf6f7cac1.png)
private int maxSize;
private long[] queArray;
private int front;
private int rear;
private int nItems;
public Queue(int s) {
maxSize = s;
queArray = new long[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
public void insert(long j) {
if (rear == maxSize - 1)
rear = -1;
queArray[++rear] = j;
nItems++;
}
private long remove() {
long temp = queArray[front++];
if (front == maxSize)
front = 0;
nItems--;
return temp;
}
public long peekFront() {
return queArray[front];
}
public boolean isEmpty() {
return (nItems == 0);
}
public boolean isFull() {
return (nItems == maxSize);
}
public int size() {
return nItems;
}
public static void main(String[] args) {
Queue queue = new Queue(5);
queue.insert(10);
queue.insert(20);
queue.insert(30);
queue.insert(40);
queue.remove();
queue.remove();
queue.remove();
queue.remove();
queue.insert(50);
queue.insert(60);
queue.insert(70);
queue.insert(80);
while (!queue.isEmpty()) {
long l = queue.remove();
System.out.print(l);
System.out.print("");
}
System.out.println(" ");
}
- 队列的效率
和栈一样,队列中插入数据项和移除数据项的时间复杂度均为O(1)