在本教程中,您将学习什么是队列。 此外,您还将发现使用 C,C++ ,Java 和 Python 实现队列的实现。
队列是编程中有用的数据结构。 它类似于电影院大厅外面的售票队列,在该队列中,第一个进入队列的人是第一个获得票的人。
队列遵循先进先出(FIFO)规则-先进入的项目也是先出来的项目。

FIFO 表示
在上图中,由于 1 在 2 之前保留在队列中,因此它也是第一个从队列中删除的队列。 它遵循 FIFO 规则。
用编程术语来说,将项目放入队列称为“入队”,而将项目从队列中删除则称为“出队”。
我们可以使用任何编程语言(例如 C,C++ ,Java,Python 或 C# )来实现队列,但是规范几乎是相同的。
队列规范
队列是一个对象,或更具体地说,是一个允许执行以下操作的抽象数据结构(ADT):
enqueue:将元素添加到队列的末尾dequeue:从队列的开头删除元素IsEmpty:检查队列是否为空IsFull:检查队列是否已满peek:获取队列前面的值而不删除它
队列如何工作
队列操作如下:
- 两个称为
FRONT和REAR的指针用于跟踪队列中的第一个和最后一个元素。 - 初始化队列时,我们将
FRONT和REAR的值设置为 -1。 - 排队元素时,我们增加
REAR索引的值,并将新元素放置在REAR指向的位置。 - 在元素出队时,我们返回
FRONT指向的值,并增加FRONT索引。 - 在排队之前,我们检查队列是否已满。
- 在出队之前,我们检查队列是否已经为空。
- 当对第一个元素进行排队时,我们将
FRONT的值设置为 0。 - 使最后一个元素出队时,我们将
FRONT和REAR的值重置为 -1。

队列操作的原理
Python,Java 和 C/C++ 示例
最常见的队列实现是使用数组,但是也可以使用列表来实现。
# Queue implementation in Pythonclass Queue:def __init__(self):self.queue = []# Add an elementdef enqueue(self, item):self.queue.append(item)# Remove an elementdef dequeue(self):if len(self.queue) < 1:return Nonereturn self.queue.pop(0)# Display the queuedef display(self):print(self.queue)def size(self):return len(self.queue)q = Queue()q.enqueue(1)q.enqueue(2)q.enqueue(3)q.enqueue(4)q.enqueue(5)q.display()q.dequeue()print("After removing an element")q.display()
// Queue implementation in Javapublic class Queue {int SIZE = 5;int items[] = new int[SIZE];int front, rear;Queue() {front = -1;rear = -1;}boolean isFull() {if (front == 0 && rear == SIZE - 1) {return true;}return false;}boolean isEmpty() {if (front == -1)return true;elsereturn false;}void enQueue(int element) {if (isFull()) {System.out.println("Queue is full");} else {if (front == -1)front = 0;rear++;items[rear] = element;System.out.println("Inserted " + element);}}int deQueue() {int element;if (isEmpty()) {System.out.println("Queue is empty");return (-1);} else {element = items[front];if (front >= rear) {front = -1;rear = -1;} /* Q has only one element, so we reset the queue after deleting it. */else {front++;}System.out.println("Deleted -> " + element);return (element);}}void display() {/* Function to display elements of Queue */int i;if (isEmpty()) {System.out.println("Empty Queue");} else {System.out.println("\nFront index-> " + front);System.out.println("Items -> ");for (i = front; i <= rear; i++)System.out.print(items[i] + " ");System.out.println("\nRear index-> " + rear);}}public static void main(String[] args) {Queue q = new Queue();// deQueue is not possible on empty queueq.deQueue();// enQueue 5 elementsq.enQueue(1);q.enQueue(2);q.enQueue(3);q.enQueue(4);q.enQueue(5);// 6th element can't be added to queue because queue is fullq.enQueue(6);q.display();// deQueue removes element entered first i.e. 1q.deQueue();// Now we have just 4 elementsq.display();}}
// Queue implementation in C#include <stdio.h>#define SIZE 5void enQueue(int);void deQueue();void display();int items[SIZE], front = -1, rear = -1;int main() {//deQueue is not possible on empty queuedeQueue();//enQueue 5 elementsenQueue(1);enQueue(2);enQueue(3);enQueue(4);enQueue(5);//6th element can't be added to queue because queue is fullenQueue(6);display();//deQueue removes element entered first i.e. 1deQueue();//Now we have just 4 elementsdisplay();return 0;}void enQueue(int value) {if (rear == SIZE - 1)printf("\nQueue is Full!!");else {if (front == -1)front = 0;rear++;items[rear] = value;printf("\nInserted -> %d", value);}}void deQueue() {if (front == -1)printf("\nQueue is Empty!!");else {printf("\nDeleted : %d", items[front]);front++;if (front > rear)front = rear = -1;}}// Function to print the queuevoid display() {if (rear == -1)printf("\nQueue is Empty!!!");else {int i;printf("\nQueue elements are:\n");for (i = front; i <= rear; i++)printf("%d ", items[i]);}printf("\n");}
// Queue implementation in C++#include <iostream>#define SIZE 5using namespace std;class Queue {private:int items[SIZE], front, rear;public:Queue() {front = -1;rear = -1;}bool isFull() {if (front == 0 && rear == SIZE - 1) {return true;}return false;}bool isEmpty() {if (front == -1)return true;elsereturn false;}void enQueue(int element) {if (isFull()) {cout << "Queue is full";} else {if (front == -1) front = 0;rear++;items[rear] = element;cout << endl<< "Inserted " << element << endl;}}int deQueue() {int element;if (isEmpty()) {cout << "Queue is empty" << endl;return (-1);} else {element = items[front];if (front >= rear) {front = -1;rear = -1;} /* Q has only one element, so we reset the queue after deleting it. */else {front++;}cout << endl<< "Deleted -> " << element << endl;return (element);}}void display() {/* Function to display elements of Queue */int i;if (isEmpty()) {cout << endl<< "Empty Queue" << endl;} else {cout << endl<< "Front index-> " << front;cout << endl<< "Items -> ";for (i = front; i <= rear; i++)cout << items[i] << " ";cout << endl<< "Rear index-> " << rear << endl;}}};int main() {Queue q;//deQueue is not possible on empty queueq.deQueue();//enQueue 5 elementsq.enQueue(1);q.enQueue(2);q.enQueue(3);q.enQueue(4);q.enQueue(5);//6th element can't be added to queue because queue is fullq.enQueue(6);q.display();//deQueue removes element entered first i.e. 1q.deQueue();//Now we have just 4 elementsq.display();return 0;}
此实现的局限性
如您在下图中所看到的,经过一些入队和出队后,队列的大小已减小。

队列限制
只有当所有元素都已出队后,才能在重置队列后使用索引 0 和 1。
在REAR到达最后一个索引之后,如果我们可以在空白空间(0 和 1)中存储额外的元素,则可以利用这些空白空间。 这通过称为循环队列的修改队列来实现。
队列复杂度
使用数组的队列中入队和出队操作的复杂度为O(1)。
队列应用
- CPU 调度,磁盘调度
- 在两个进程之间异步传输数据时,使用队列进行同步。 例如:IO 缓冲区,管道,文件 IO 等
- 实时系统中的中断处理。
- 呼叫中心电话系统使用队列来保持人们按顺序呼叫他们
