STL stack容器
容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。
stack<T>
容器适配器中的数据是以 LIFO
方式组织的,这和自助餐馆中堆叠的盘子、箱子中的一堆书类似。图 1 展示了一个理论上的 stack
容器及其一些基本操作。只能访问 stack
顶部的元素;只有在移除 stack
顶部的元素后,才能访问下方的元素。
stack
容器有广泛的应用。例如,编辑器中的 undo
(撤销)机制就是用堆栈来记录连续的变化。撤销操作可以取消最后一个操作,这也是发生在堆栈顶部的操作。编译器使用堆栈来解析算术表达式,当然也可以用堆栈来记录 C++ 代码的函数调用。下面展示了如何定义一个用来存放字符串对象的 stack 容器:
std::stack<std::string> words;
stack 容器适配器的模板有两个参数。第一个参数是存储对象的类型,第二个参数是底层容器的类型。stack<T>
的底层容器默认是 deque<T>
容器,因此模板类型其实是 stack<typename T, typename Container=deque<T>>
。通过指定第二个模板类型参数,可以使用任意类型的底层容器,只要它们支持 back()、push_back()、pop_back()、empty()、size()
这些操作。下面展示了如何定义一个使用 list<T>
的堆栈:
std::stack<std::string,std::list<std::string>> fruit;
创建堆栈时,不能在初始化列表中用对象来初始化,但是可以用另一个容器来初始化,只要堆栈的底层容器类型和这个容器的类型相同。例如:
std::list<double> values {1.414, 3.14159265, 2.71828}; std::stack<double,std::list<double>> my_stack (values);
第二条语句生成了一个包含 value
元素副本的 my_stack
。这里不能在 stack
构造函数中使用初始化列表;必须使用圆括号。如果没有在第二个 stack
模板类型参数中将底层容器指定为 list
,那么底层容器可能是 deque
,这样就不能用 list
的内容来初始化 stack
;只能接受 deque
。
stack
std::stack<double,std::list<double>>copy_stack {my_stack}
copy_stack
是 my_stack
的副本。如你所见,在使用拷贝构造函数时,既可以用初始化列表,也可以用圆括号。
常用函数
stack<int> q; //以int型为例
int x;
q.push(x); //将x压入栈顶
q.top(); //返回栈顶的元素
q.pop(); //删除栈顶的元素
q.size(); //返回栈中元素的个数
q.empty(); //检查栈是否为空,若为空返回true,否则返回false
本文作者:PassName
本文链接:https://www.cnblogs.com/spaceswalker/p/15911345.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步