施工企业资料,搜索优化的培训免费咨询,为何网站需改版,免费搭建手机网站源码stack 栈适配器是一种单端开口的容器#xff08;如图 1 所示#xff09;#xff0c;实际上该容器模拟的就是栈存储结构#xff0c;即无论是向里存数据还是从中取数据#xff0c;都只能从这一个开口实现操作。 图 1 stack 适配器示意图 如图 1 所示#xff0c;stack 适配器…stack 栈适配器是一种单端开口的容器如图 1 所示实际上该容器模拟的就是栈存储结构即无论是向里存数据还是从中取数据都只能从这一个开口实现操作。 图 1 stack 适配器示意图 如图 1 所示stack 适配器的开头端通常称为栈顶。由于数据的存和取只能从栈顶处进行操作因此对于存取数据stack 适配器有这样的特性即每次只能访问适配器中位于最顶端的元素也只有移除 stack 顶部的元素之后才能访问位于栈中的元素。 栈中存储的元素满足“后进先出简称LIFO”的准则stack 适配器也同样遵循这一准则。 stack容器适配器的创建
由于 stack 适配器以模板类 stackT,ContainerdequeT其中 T 为存储元素的类型Container 表示底层容器的类型的形式位于stack头文件中并定义在 std 命名空间里。因此在创建该容器之前程序中应包含以下 2 行代码
#include stackusing namespace std;
创建 stack 适配器大致分为如下几种方式。 1) 创建一个不包含任何元素的 stack 适配器并采用默认的 deque 基础容器
std::stackint values;
上面这行代码就成功创建了一个可存储 int 类型元素底层采用 deque 基础容器的 stack 适配器。 2) 上面提到stackT,ContainerdequeT 模板类提供了 2 个参数通过指定第二个模板类型参数我们可以使用出 deque 容器外的其它序列式容器只要该容器支持 empty()、size()、back()、push_back()、pop_back() 这 5 个成员函数即可。 在介绍适配器时提到序列式容器中同时包含这 5 个成员函数的有 vector、deque 和 list 这 3 个容器。因此stack 适配器的基础容器可以是它们 3 个中任何一个。例如下面展示了如何定义一个使用 list 基础容器的 stack 适配器
std::stackstd::string, std::listint values;
3) 可以用一个基础容器来初始化 stack 适配器只要该容器的类型和 stack 底层使用的基础容器类型相同即可。例如
std::listint values {1, 2, 3};std::stackint,std::listint my_stack (values);
注意初始化后的 my_stack 适配器中栈顶元素为 3而不是 1。另外在第 2 行代码中stack 第 2 个模板参数必须显式指定为 listint必须为 int 类型和存储类型保持一致否则 stack 底层将默认使用 deque 容器也就无法用 lsit 容器的内容来初始化 stack 适配器。 4) 还可以用一个 stack 适配器来初始化另一个 stack 适配器只要它们存储的元素类型以及底层采用的基础容器类型相同即可。例如 std::listint values{ 1, 2, 3 };std::stackint, std::listint my_stack1(values);std::stackint, std::listint my_stackmy_stack1;//std::stackint, std::listint my_stack(my_stack1); 可以看到和使用基础容器不同使用 stack 适配器给另一个 stack 进行初始化时有 2 种方式使用哪一种都可以。 注意第 3、4 种初始化方法中my_stack 适配器的数据是经过拷贝得来的也就是说操作 my_stack 适配器并不会对 values 容器以及 my_stack1 适配器有任何影响反过来也是如此。 stack容器适配器支持的成员函数
和其他序列容器相比stack 是一类存储机制简单、提供成员函数较少的容器。表 1 列出了 stack 容器支持的全部成员函数。
表 1 stack容器适配器支持的成员函数 成员函数功能empty()当 stack 栈中没有元素时该成员函数返回 true反之返回 false。size()返回 stack 栈中存储元素的个数。top()返回一个栈顶元素的引用类型为 T。如果栈为空程序会报错。push(const T val)先复制 val再将 val 副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。push(T obj)以移动元素的方式将其压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。pop()弹出栈顶元素。emplace(arg...)arg... 可以是一个参数也可以是多个参数但它们都只用于构造一个对象并在栈顶直接生成该对象作为新的栈顶元素。swap(stackT other_stack)将两个 stack 适配器中的元素进行互换需要注意的是进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型都必须相同。 下面这个例子中演示了表 1 中部分成员函数的用法
#includeiostream
#includestack
#includelist
using namespace std;
int main(){listintvalues{1,2,3};stackint,listintmy_stack(values);//查看 my_stack 存储元素的个数cout size of my_stack: my_stack.size() endl;//将 my_stack 中存储的元素依次弹栈直到其为空while (!my_stack.empty()){cout my_stack.top() endl;//将栈顶元素弹栈my_stack.pop();}return 0;
} 运行结果为
size of my_stack: 3 3 2 1