Bootstrap

「STL::stack」标准库容器:stack(堆栈|栈)介绍(C++)

目录

概述

构造析构

赋值重构

数据访问

 内存管理

数据控制

Tips


概述

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。

;