深入浅出数据结构:队列(Queue)—— 生活中的排队艺术
在我们的日常生活中,“排队”是一种再熟悉不过的场景——无论是排队买票、排队打饭还是排队等候服务,我们都遵循着一个简单而公平的原则:“先来的人先得到服务”。在计算机科学的世界里,同样存在着这样一种完美模拟“排队”行为的数据结构,它就是我们今天的主角——队列(Queue)。
一、什么是队列?先进先出的智慧
根据笔记,我们首先要明确队列的核心概念:
- 先进先出(FIFO): 这是队列最根本的特性,全称为 "First-In, First-Out"。这与我们之前可能接触过的**栈(Stack)**的“后进先出”(LIFO, "Last-In, First-Out")特性形成了鲜明的对比。可以想象一下排队打饭,最早进入队伍的人,肯定是第一个打到饭的。
- 受限的线性表: 队列本质上是一种线性表,但它的操作受到了限制。数据只能从一端进入,从另一端离开。
- 队头(Front)与队尾(Rear):
- 队尾(Rear):允许插入新元素的一端,我们称之为“入队”(Enqueue)。
- 队头(Front):允许删除元素的一端,我们称之为“出队”(Dequeue)。
二、队列的核心操作接口
一个设计良好的队列,通常会提供以下几个核心的接口,方便我们进行操作:
- 入队
push(element)
: 将一个元素添加到队尾。 - 出队
pop()
: 从队头移除一个元素。 - 获取队头元素
front()
: 查看队头的元素,但不移除它。 - 获取队尾元素
back()
: 查看队尾的元素,但不移除它。 - 获取队列大小
size()
: 返回队列中当前元素的数量。 - 判断队列是否为空
empty()
: 检查队列中是否没有任何元素。
三、代码实战:在 C++ 中使用队列
理论说再多,不如亲手敲一遍代码。下面我们通过两个案例来展示队列的使用:首先是使用 C++ 标准模板库(STL)中现成的 std::queue
,然后我们尝试自己动手实现一个简单的队列。
案例一:使用 C++ STL 中的 std::queue
C++ STL 为我们提供了封装好的队列容器,使用起来非常方便。你需要包含 <queue&