stack的使用
#include<stack>
方法 | 描述 |
stack.push(elem); | 往栈顶添加元素。 |
stack.pop(); | 从栈顶移除第一个元素。 |
stack.top(); | 返回栈顶元素。 |
stack.empty(); | 判断堆栈是否为空,栈空返回true,栈非空返回false。 |
stack.size(); | 返回堆栈的大小,即堆栈中的元素数量。 |
queue的使用
#include<queue>
方法 | 描述 |
queue.push(elem) | 把元素压入队列尾部。 |
queue.pop() | 删除队首元素,但不返回该元素。 |
queue.front() | 返回队首元素,但不删除。 |
queue.back() | 返回队尾元素,但不删除。 |
queue.size() | 返回队列中元素的个数。 |
queue.empty() | 检查队列是否为空,如果为空返回true,否则返回false。 |
stack源码
容器适配器,它提供了特定的接口( LIFO 栈操作),这些接口是通过封装另一个底层容器(如 deque, vector, 或 list)的功能实现的。这种设计允许 stack 继承底层容器的效率和存储能力,同时提供简化的接口以满足特定的数据结构需求。
指定底层容器的类型,deque 被用作默认容器。deque(双端队列)是一个高效的序列容器,允许在两端快速插入和删除。尽管 deque 是默认选择,但用户可以通过模板参数选择其他容器,如 vector 或 list,只要这些容器支持 back(), push_back(), 和 pop_back() 操作。
栈操作的实现:
empty():直接调用底层容器的 empty() 方法来判断栈是否为空。
size():调用底层容器的 size() 方法来获取栈中元素的数量。
top():返回对底层容器最后一个元素的引用,即栈顶元素。这通过调用底层容器的 back() 方法实现。
push():在底层容器的末尾添加一个元素,相当于将元素压入栈顶。这通过调用底层容器的 push_back() 方法实现。
pop():移除底层容器的最后一个元素,相当于从栈顶移除一个元素。这通过调用底层容器的 pop_back() 方法实现。
通过封装底层容器,stack 类隐藏了容器操作的复杂性,为用户提供了一个简单且易于使用的 LIFO 数据结构。这种封装还提供了灵活性,因为底层容器可以很容易地被替换,而不影响 stack 类的公共接口。
queue源码
默认情况下,queue 使用 deque 作为其底层容器,因为 deque 支持高效的在两端插入和删除操作,符合队列的操作需求。然而,通过模板参数,用户可以指定其他类型的容器(如 list),只要这个容器支持 front(), back(), push_back(), 和 pop_front() 操作。
入队(push):在底层容器的尾部添加元素,对应于队列的尾部。
出队(pop):从底层容器的头部移除元素,对应于队列的头部。
访问队首(front)和队尾(back)元素:通过直接访问底层容器的对应元素实现。
通过封装底层容器,queue 类隐藏了容器操作的复杂性,为用户提供了一个简单且易于使用的 FIFO 数据结构。这种封装还提供了灵活性,因为底层容器可以很容易地被替换,而不影响 queue 类的公共接口。queue 类模板的设计反映 C++ STL 容器和容器适配器的通用设计哲学,即通过组合和封装提供高效、灵活的数据结构实现。
参考
《STL源码剖析》