(翻译文)
在本教程中,您将了解队列是什么。此外,您还可以在java中找到队列的实现。
队列是编程中一种有用的数据结构。这类似于电影院大厅外的售票队列,第一个进入队列的人是第一个拿到票的人。
队列遵循先进先出(FIFO)规则-先进入的项目也是先出来的项目。
在上图中,由于1在2之前保留在队列中,因此它也是第一个从队列中删除的队列。它遵循FIFO规则。
用编程术语来说,将项目放入队列称为“入队”,而将项目从队列中删除则称为“出队”。
我们可以使用任何编程语言(例如C,C ++,Java,Python或C#)来实现队列,但是规范几乎是相同的。
队列的基本操作
队列是一个对象,或更具体地说,是一个允许执行以下操作的抽象数据结构(ADT):
- Enqueue:将元素添加到队列的末尾
- Dequeue:从队列的前面删除一个元素
- IsEmpty:检查队列是否为空
- IsFull:检查队列是否已满
- Peek:获取队列最前面的值而不删除它
队列工作
队列操作如下:
- 两个指针 FRONT 和 REAR
- FRONT 指向队列的第一个元素
- REAR 指向队列的最后一个元素
- 最初,将 FRONT 和 REAR 的值设置为-1
入队操作
- 检查队列是否已满
- 对于第一个元素,设置 FRONT 为0
- REAR 索引增加1
- 在 REAR 指向的位置添加新元素
出队操作
- 检查队列是否为空
- 返回 FRONT 所指的值
- FRONT 的索引增加1
- 对于最后一个元素,重置 FRONT 和 REAR 的值为 -1
Java中的队列实现
最常见的队列实现是使用数组,但是也可以使用列表来实现。
// 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 queue because 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();
}
}
运行结果如下:
Queue is empty
Inserted 1
Inserted 2
Inserted 3
Inserted 4
Inserted 5
Queue is full
Front index-> 0
Items ->
1 2 3 4 5
Rear index-> 4
Deleted -> 1
Front index-> 1
Items ->
2 3 4 5
Rear index-> 4
队列限制
如您在下图中所看到的,经过一些入队和出队后,队列的大小已减小。
只有当所有元素都已出队后,才能在重置队列后使用索引0和1。
在 REAR 到达最后一个索引,如果我们可以在多余的空间(0和1)中存储多余的元素,则可以利用这些空白。这是由一个称为循环队列的修改队列实现的。
复杂度分析
使用数组的队列中入队和出队操作的复杂度为O(1)。
队列数据结构的应用
- CPU调度,磁盘调度
- 在两个进程之间异步传输数据时。队列用于同步。例如:IO缓冲区,管道,文件IO等
- 实时系统中的中断处理。
- 呼叫中心电话系统使用队列来使人们按顺序呼叫
参考文档
https://www.programiz.com/dsa/queue