C++ 中 Stack 与 Queue:抽象数据类型的魅力与实现
在 C++ 编程中,Stack(栈)和 Queue(队列)是两种重要的抽象数据类型(ADT),它们以不同的方式管理和存储数据。尽管它们都是线性数据结构,但它们在数据访问和操作上的规则有所不同,从而适合于不同的应用场景。
Stack(栈)
特性:
- 后进先出(LIFO):栈遵循 LIFO 原则,即最后被放入栈的元素最先被取出。
- 典型操作:
push()
:将元素压入栈顶。pop()
:移除栈顶元素。top()
:访问栈顶元素但不移除。
实现:
在 C++ 中,可以使用 STL 中的 std::stack
来实现栈。它通常是基于更基础的容器(如 std::vector
或 std::deque
)来实现的。
#include <iostream>
#include <stack>
int main() {
std::stack<int> s;
s.push(1);
s.push(2);
s.push(3);
while (!s.empty()) {
std::cout << s.top() << " ";
s.pop();
}
return 0;
}
// 输出:3 2 1
栈通常用于处理逆序操作、递归算法的隐式实现、括号匹配等场景。
Queue(队列)
特性:
- 先进先出(FIFO):队列遵循 FIFO 原则,即最先被放入队列的元素最先被取出。
- 典型操作:
enqueue()
:向队列尾端添加元素(在 C++ 中通常是push()
)。dequeue()
:从队列头部移除元素(在 C++ 中通常是pop()
)。front()
:访问队列头部的元素但不移除。back()
:访问队列尾部的元素。
实现:
在 C++ 中,可以使用 STL 中的 std::queue
来实现队列,其通常基于 std::deque
实现。
#include <iostream>
#include <queue>
int main() {
std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);
while (!q.empty()) {
std::cout << q.front() << " ";
q.pop();
}
return 0;
}
// 输出:1 2 3
队列用于广度优先搜索(BFS)、任务调度系统、打印任务管理等。
小结
栈与队列尽管在概念上非常简单,但在实际应用中,它们为解决许多算法和编程问题提供了极大的便利。通过 STL 提供的实现,开发者可以专注于算法和逻辑,而无需关心底层细节,这正是抽象数据类型的魅力所在。通过灵活运用这些 ADT,开发者能够更加高效地管理数据,进而编写出更优秀的程序。