栈与队列https://blog.csdn.net/qq_45467165/article/details/127958960?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127958960%22%2C%22source%22%3A%22qq_45467165%22%7D
队列(Queue)是一种常见的线性数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则,类似于现实生活中排队的场景。在队列中,首先进入队列的元素将首先被移出队列。队列在计算机科学中有着广泛的应用,例如任务调度、打印任务管理、广度优先搜索等。
队列的基本原理
队列的基本操作包括入队(Enqueue)和出队(Dequeue)。入队操作将元素添加到队列的尾部,而出队操作则从队列的头部移除元素。这保证了先进入队列的元素会先被移出,实现了先进先出的特性。
注意
假设我们有一个数组,数组的前部表示队头,后部表示队尾,
[队头, 元素1, 元素2, ..., 元素N, 队尾]
在刚开始时,队列为空,队头和队尾都位于数组的同一个位置。随着元素的入队,队尾不断向后移动;随着元素的出队,队头不断向后移动。
当执行入队操作时,我们将元素添加到队列的末尾,即队尾位置向后移动一个位置,然后将元素放在新的队尾位置上。这保证了新的元素总是被添加到队列的末尾。
当执行出队操作时,我们将队头位置向后移动一个位置,表示当前队头元素被移出队列。这样,队头所指向的元素就被出队,而队列中的其他元素保持不变。
通过这种方式,队列的元素始终按照入队的先后顺序排列在数组中,队头和队尾不断向后移动,实现了先进先出的特性。
需要注意的是,当队列的元素数量达到队列的容量上限时,继续执行入队操作将导致队列溢出。因此,在实际应用中,需要合理设置队列的容量,以避免出现溢出的情况。
队列的表示方法
我们可以用字符图来表示队列的操作原理。假设我们有一个初始为空的队列:
初始状态:
队头 队尾
--------------
| |
--------------
- 将元素A入队:
队头 队尾
--------------
| A |
--------------
- 将元素B入队:
队头 队尾
--------------
| A |
--------------
| B |
--------------
- 将元素C入队:
队头 队尾
--------------
| A |
--------------
| B |
--------------
| C |
--------------
出队操作:
- 执行出队操作:
队头 队尾 -------------- | B | -------------- | C | --------------
- 再次执行出队操作:
队头 队尾
--------------
| C |
--------------
- 执行出队操作后,队列为空:
队头 队尾
--------------
| |
--------------
队列的应用
假设我们有一个打印队列,多个打印任务需要依次打印。新的打印任务总是加入到队列的末尾,而正在打印的任务从队列头部移除。这里用字符图来表示打印队列的过程:
初始状态:
队头 队尾
---------------------
| |
---------------------
打印任务A、B、C分别加入队列:
队头 队尾
---------------------
| A B C |
---------------------
开始打印任务A:
队头 队尾
---------------------
| B C |
---------------------
打印任务B完成,开始打印任务C:
队头 队尾
---------------------
| C |
---------------------
打印任务C完成,队列为空:
队头 队尾
---------------------
| |
---------------------
队列的代码实现
#include <iostream>
#include <queue>
using namespace std;
int main() {
// 创建一个队列
queue<int> q;
// 入队操作
q.push(1);
q.push(2);
q.push(3);
// 出队操作
q.pop();
// 获取队头元素
int front_element = q.front();
cout << "队头元素:" << front_element << endl;
// 获取队列大小
int queue_size = q.size();
cout << "队列大小:" << queue_size << endl;
return 0;
}
以上代码使用了C++标准库中的queue
容器来实现队列操作。通过入队(push
)、出队(pop
)、获取队头元素(front
)和获取队列大小(size
),我们可以方便地操作队列中的元素。
总结
队列作为一种基本的数据结构,在计算机科学中有着重要的应用。通过先进先出的原则,队列能够很好地模拟现实生活中的排队场景,并在各种算法和应用中发挥着重要作用。无论是任务调度、打印管理还是广度优先搜索,队列都是不可或缺的工具之一。