栈中存储的元素满足“后进先出(简称LIFO)”的准则,stack 适配器也同样遵循这一准则。
#include <stack> using namespace std;
创建 stack 适配器,大致分为如下几种方式。std 命名空间也可以在使用 stack 适配器时额外注明。
std::stack<int> values;上面这行代码,就成功创建了一个可存储 int 类型元素,底层采用 deque 基础容器的 stack 适配器。
std::stack<std::string, std::list<int>> values;
std::list<int> values {1, 2, 3}; std::stack<int,std::list<int>> my_stack (values);注意,初始化后的 my_stack 适配器中,栈顶元素为 3,而不是 1。另外在第 2 行代码中,stack 第 2 个模板参数必须显式指定为 list<int>(必须为 int 类型,和存储类型保持一致),否则 stack 底层将默认使用 deque 容器,也就无法用 lsit 容器的内容来初始化 stack 适配器。
std::list<int> values{ 1, 2, 3 }; std::stack<int, std::list<int>> my_stack1(values); std::stack<int, std::list<int>> my_stack=my_stack1; //std::stack<int, std::list<int>> my_stack(my_stack1);
注意,第 3、4 种初始化方法中,my_stack 适配器的数据是经过拷贝得来的,也就是说,操作 my_stack 适配器,并不会对 values 容器以及 my_stack1 适配器有任何影响;反过来也是如此。
成员函数 | 功能 |
---|---|
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(stack<T> & other_stack) | 将两个 stack 适配器中的元素进行互换,需要注意的是,进行互换的 2 个 stack 适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
#include <iostream> #include <stack> #include <list> using namespace std; int main() { //构建 stack 容器适配器 list<int> values{ 1, 2, 3 }; stack<int, list<int>> my_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
表 1 中其它成员函数的用法也非常简单,这里不再给出具体示例,后续章节用法会做具体介绍。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有