目录
概述
stack 是一种C++标准模板库STL中定义的一种序列容器,它允许你在运行时动态地进行栈操作。
stack 可以自动管理内存,这意味着你可以添加任意多的元素在其中,并且你不需要手动分配和释放内存。
栈即是容器,也是适配器,它同时具有容器和适配器的特性:
动态大小:内存空间可以根据需要自动增长和缩小。
栈行为:栈总是执行先入后出原则。
元素容器:可以存储任何类型的元素,包括基本类型、对象、指针等。
关于栈的行为:
栈的显著特点是他的添加元素与删除元素操作:先加入的元素总是后被弹出。
一个栈应该应该是这样的:
--------------STACK------------- ———— ←-- ———— ←-- ———— ←-- ———— ←-- push() T1 T2 T3 T4 ———— --→ ———— --→ ———— --→ ———— --→ pop() -------------------------------- bottom top()
Tn代表该元素被加入到队列的次序。
一个队列有以下三种基本行为:
top()表示对队列头元素的访问操作。如得到元素T4。
pop()表示对队列头元素的弹出操作。我们弹出T4
--------------STACK------------- ———— ←-- ———— ←-- ———— ←-- push() T1 T2 T3 ———— --→ ———— --→ ———— --→ pop() -------------------------------- bottom top()
现在T3成为栈顶元素。
push()表示对队列尾部压入新元素。我们压入T5
--------------STACK------------- ———— ←-- ———— ←-- ———— ←-- ———— ←-- push() T2 T3 T4 T5 ———— --→ ———— --→ ———— --→ ———— --→ pop() -------------------------------- bottom top()
现在T5成为栈顶元素。
接下来,我们介绍stack类型定义的成员函数。
*注意*:本文不涉及allocator空间配置器和C++23新增的range类函数。
构造析构
STL库提供了以下方式创建一个stack。
以T表示任意类型。
无参构造 | stack<T>stk(); | 生成一个存储T类型的栈stack。 |
提供容器的构造 | stack<T,list<T>>stk(const list& lst); stack<T,vector<T>>stk(const vector& vec); stack<T,deque<T>>stk(const deque& deq); | 从列出的三种容器中获得数据组成栈stack。 |
提供源数据地址的构造 (C++23) | stack<T>stk(T* begin,T* end); | 从定长数组(初末指针)或另一容器(初末迭代器)中获取数据进行构造。 需要注意的是,迭代器指向的容器不一定是另一个stack,它只需是一个提供随机访问迭代器(即支持it++、it--)的容器即可。 |
拷贝构造 | stack<T>stk(const stack& another); | 将another整体赋值给新stack。 |
移动构造 | stack<T>stk(stack&& another); | 窃取另一个stack容器,即直接获取它维护的底层指针地址,再将它的指针置空。 |
析构函数 | ~stack(); | 无须手动调用。程序自动在代码块结束时调用,清理掉stack。 |
赋值重构
在必要时我们会对stack进行重新初始化。
重载拷贝赋值= | stack& (const stack& another); | 作用同拷贝构造。不仅可以在初始构造时使用。返回自身。 |
重载移动赋值= | stack& (stack&& another); | 作用同移动构造。不仅可以在初始构造时使用。返回自身。 |
数据访问
stack对访问权限要求严格,你只能访问栈顶元素。
访问栈顶元素 | top(); | 返回栈顶元素。 |
内存管理
stack仅有两个内存相关函数。
获取实际长度 | size(); | 返回stack中的元素个数。 |
判断是否为空 | empty(); | size==0时返回true,否则返回false。 |
数据控制
数据控制是stack的核心。
栈顶压入 | push(T elem); | 在栈顶加入元素。 |
栈顶弹出 | pop_back(); | 弹出栈顶元素。 |
交换 | swap(stack& another); | 交换两个容器的元素。 |
安置(C++11) | emplace(T elem); | C++11后可用,原地构造一个元素,作用与push()相同,但没有赋值过程而是原地生成新元素,所以效率更高。 |
Tips
stack底层默认以deque双端队列方式实现,实际上,stack就是一个操作受限的deque。