动力节点小编来告诉大家,队列是编程中一种有用的数据结构。类似于电影院外的售票队列,第一个进入队列的人就是第一个拿到票的人。
Java队列遵循先进先出 (FIFO)规则 - 先进入的项目是先出的项目。
在上图中,由于 1 在 2 之前保留在队列中,因此它也是第一个从队列中删除的。它遵循先进先出规则。
在编程术语中,将项目放入队列称为enqueue,从队列中移除项目称为dequeue。
我们可以使用任何编程语言(如 C、C++、Java、Python 或 C#)实现队列,但规范几乎相同。
队列的基本操作
队列是一个对象(一种抽象数据结构 - ADT),它允许以下操作:
Enqueue : 向队列末尾添加一个元素
Dequeue : 从队列前面移除一个元素
IsEmpty : 检查队列是否为空
IsFull : 检查队列是否已满
Peek:获取队列前端的值而不移除它
队列的工作
队列操作的工作方式如下:
两个指针和跟踪队列的第一个元素
跟踪队列的最后一个元素
最初,设置值和-1
入队操作
检查队列是否已满
对于第一个元素,设置值到 0
增加索引 1
在指向的位置添加新元素
出队操作
检查队列是否为空
返回指向的值增加索引 1
对于最后一个元素,重置值和-1
我们通常使用数组来实现 Java 和 C/++ 中的队列。对于 Python,我们使用列表。
// Queue implementation in Java
public 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;
else
return 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 queue
q.deQueue();
// enQueue 5 elements
q.enQueue(1);
q.enQueue(2);
q.enQueue(3);
q.enQueue(4);
q.enQueue(5);
// 6th element can't be added to because the queue is full
q.enQueue(6);
q.display();
// deQueue removes element entered first i.e. 1
q.deQueue();
// Now we have just 4 elements
q.display();
}
}
复杂性分析
使用的数组队列中入队和出队操作的复杂度为O(1)。如果您pop(N)在 python 代码中使用,那么复杂性可能O(n)取决于要弹出的项目的位置。
队列的应用
CPU调度、磁盘调度
当两个进程之间异步传输数据时,队列用于同步。例如:IO Buffers、管道、文件IO等
处理实时系统中的中断。
呼叫中心电话系统使用队列将呼叫他们的人按顺序排列。