STL学习笔记之容器--stack
来源:互联网 发布:三明学院网络教学平台 编辑:程序博客网 时间:2024/05/16 15:04
堆栈是一个线性表,插入和删除只在表的一端进行。这一端称为栈顶(Stack Top),另一端则为栈底(Stack Bottom)。堆栈的元素插入称为入栈,元素的删除称为出栈。由于元素的入栈和出栈总在栈顶进行,因此,堆栈是一个后进先出(Last In First Out)表,即 LIFO 表。
C++ STL 的堆栈泛化是直接通过现有的序列容器来实现的,默认使用双端队列deque的数据结构,当然,可以采用其他线性结构(vector 或 list等),只要提供堆栈的入栈、出栈、栈顶元素访问和判断是否为空的操作即可。由于堆栈的底层使用的是其他容器,因此,堆栈可看做是一种适配器,将一种容器转换为另一种容器(堆栈容器)。
为了严格遵循堆栈的数据后进先出原则,stack 不提供元素的任何迭代器操作,因此,stack 容器也就不会向外部提供可用的前向或反向迭代器类型。
stack堆栈容器的C++标准头文件为 stack ,必须用宏语句 "#include <stack>" 包含进来,才可对 stack 堆栈的程序进行编译。
创建 stack 对象
使用堆栈前,先要利用构造函数进行初始化,创建一个堆栈对象,以进行元素的入栈、出栈等操作。
1. stack()
默认构造函数,创建一个空的 stack 对象。
例如,下面一行代码使用默认的 deque 为底层容器,创建一个空的堆栈对象 s 。
stack<int> s;
2. stack(const stack&)
复制构造函数,用一个 stack 堆栈创建一个新的堆栈。
例如,下面的代码利用 s1 ,创建一个以双向链表为底层容器的空堆栈对象 s2 。
// stack<int, list<int> > s1;
stack<int, list<int> > s2(s1);
元素入栈
stack堆栈容器的元素入栈函数为 push 函数。由于 C++ STL 的堆栈函数是不预设大小的,因此,入栈函数就不考虑堆栈空间是否为满,均将元素压入堆栈,从而函数没有标明入栈成功与否的返回值。
如下是他的使用原型:
void push(const value_type& x)
元素出栈
stack容器的元素出栈函数为 pop 函数,由于函数并没有判断堆栈是否为空,才进行元素的弹出,因此,需要自行判断堆栈是否为空,才可执行 pop 函数。
void pop()
下面的示例代码,将堆栈的所有元素全部出栈
// stack<int> s;
while(!s.empty())
{
s.pop();// 出栈
}
取栈顶元素
stack容器的栈顶元素的读取函数为 pop 函数,将取出最后入栈的元素,如下是它的使用原型
value_type& top()
堆栈非空判断
随着堆栈元素不断出栈,堆栈可能会出现空的情况,因此,一般需要调用 empty 函数判断是否非空,才作元素出栈和取栈顶元素的操作。
bool empty()
判断堆栈是否为空,返回 true 表示堆栈已空,false 表示堆栈非空。
//----------------------------------------- 读取堆栈的栈顶元素#include <stack>#include <iostream>using namespace std;int main(){ // 创建堆栈对象 stack<int> s; // 元素入栈 s.push(3); s.push(19); s.push(23); s.push(36); s.push(50); s.push(4); // 元素依次出栈 while(!s.empty()) { // 打印栈顶元素,打印出:4 50 36 23 19 3 cout << s.top() << endl; // 出栈 s.pop(); } return 0;}
VS2008中栈的源代码
友情提示:初次阅读时请注意其实现思想,不要在细节上浪费过多的时间。
//VS2008中 stack的定义 MoreWindows整理(http://blog.csdn.net/MoreWindows)template<class _Ty, class _Container = deque<_Ty> >class stack{// LIFO queue implemented with a containerpublic:typedef _Container container_type;typedef typename _Container::value_type value_type;typedef typename _Container::size_type size_type;typedef typename _Container::reference reference;typedef typename _Container::const_reference const_reference;stack() : c(){// construct with empty container}explicit stack(const _Container& _Cont) : c(_Cont){// construct by copying specified container}bool empty() const{// test if stack is emptyreturn (c.empty());}size_type size() const{// test length of stackreturn (c.size());}reference top(){// return last element of mutable stackreturn (c.back());}const_reference top() const{// return last element of nonmutable stackreturn (c.back());}void push(const value_type& _Val){// insert element at endc.push_back(_Val);}void pop(){// erase last elementc.pop_back();}const _Container& _Get_container() const{// get reference to containerreturn (c);}protected:_Container c;// the underlying container};
可以看出,由于栈只是进一步封装别的数据结构,并提供自己的接口,所以代码非常简洁,如果不指定容器,默认是用deque来作为其底层数据结构的(对deque不是很了解?可以参阅《STL系列之一 deque双向队列》)。下面给出栈的使用范例:
//栈 stack支持 empty() size() top() push() pop()// by MoreWindows(http://blog.csdn.net/MoreWindows)#include <stack>#include <vector>#include <list>#include <cstdio>using namespace std;int main(){//可以使用list或vector作为栈的容器,默认是使用deque的。stack<int, list<int>> a;stack<int, vector<int>> b;int i;//压入数据for (i = 0; i < 10; i++){a.push(i);b.push(i);}//栈的大小printf("%d %d\n", a.size(), b.size());//取栈项数据并将数据弹出栈while (!a.empty()){printf("%d ", a.top());a.pop();}putchar('\n');while (!b.empty()){printf("%d ", b.top());b.pop();}putchar('\n');return 0;}stack 小结
堆栈是一种应用非常广泛的数据结构。C++ STL 将这种数据结构和它若干受限制操作用泛型类 stack 容器封装出来,包括堆栈初始化、元素入栈、取栈顶元素、元素出栈、判断堆栈是否非空和取得当前堆栈大小等,应用起来十分容易。
stack的元素出栈操作是不返回栈顶元素的,需要另外通过取栈顶函数获得。这种分离实现是考虑到出栈函数若直接返回栈顶元素,将会导致返回值的数据引用安全问题或不必要的低效复制函数的调用。
从 stack 内部实现看,stack 堆栈是不设最大容量的,但可通过 size 函数获取当前堆栈的大小,以判断是否允许继续让元素入栈,实现具有最大容量限制的堆栈。
参考链接:http://blog.csdn.net/morewindows/article/details/6950881
http://www.cnblogs.com/music-liang/archive/2013/04/10/3011701.html
- STL学习笔记之容器--stack
- C++ STL--stack堆栈容器学习笔记
- STL学习笔记-stack容器(栈)
- STL之stack&queue容器(笔记)
- stl::stack容器学习
- STL容器之stack
- STL容器之stack
- stl之stack容器
- STL容器之stack
- STL之stack容器
- STL学习笔记— —特殊容器stack
- STL学习笔记11— —特殊容器stack
- STL容器之stack栈
- 标准模板库(STL)学习探究之Stack容器
- STL学习之stack
- stl之顺序容器学习笔记1
- stl之顺序容器学习笔记2
- stl之顺序容器学习笔记3
- AndroidManifest.xml详解(下)
- 全双工和半双工的区别
- 无法将类型为“Shell32.ShellClass”的 COM 对象强制转换为接口类型“Shell32.IShellDispatch 6”
- 百度天气预报接口
- OSG开发概览
- STL学习笔记之容器--stack
- windows窗口样式
- jQuery开发之DOM操作三
- 新东西006--Activity启动模式
- [Erlang]port(gen_tcp)如何并行?
- 第一章:Android之Linux(Ubuntu)环境配置
- Mapped Statements collection does not contain value for xxxx
- Android Studio 导入jar包
- Lintcode(2)-比较字符串