博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL学习笔记-- stack
阅读量:6947 次
发布时间:2019-06-27

本文共 2960 字,大约阅读时间需要 9 分钟。

stack堆栈容器

    堆栈是一个线性表,插入和删除只在表的一端进行。这一端称为栈顶(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 表示堆栈非空。

1 //----------------------------------------- 读取堆栈的栈顶元素 2 #include 
3 #include
4 using namespace std; 5 int main() 6 { 7 // 创建堆栈对象 8 stack
s; 9 // 元素入栈10 s.push(3);11 s.push(19);12 s.push(23);13 s.push(36);14 s.push(50);15 s.push(4);16 17 // 元素依次出栈18 while(!s.empty())19 {20 // 打印栈顶元素,打印出:4 50 36 23 19 321 cout << s.top() << endl;22 // 出栈23 s.pop();24 }25 26 return 0;27 }

 

 

1 /*    堆栈的大小 2     堆栈的元素个数可用 size 函数获得。每次元素入栈前,先检查当前堆栈的大小,超过某个界限值,则不允许元素入栈,以此可实现一个具有一定容量限制的堆栈。 3     size_type  size() 4     返回当前堆栈的元素个数 5      6     下面的示例程序,将堆栈的大小设置为 100 个 int 元素,而且使用 list 双向链表做堆栈的底层容器,每次压入元素时均判断堆栈的大小是否超过100个元素的界限,从而实现具有容量限制的堆栈。 7 */ 8  9 ----------------------------------------- 限制堆栈的大小10 #include 
11 #include
12 #include
13 #define STACK_SIZE 100 // 堆栈最大容量14 using namespace std;15 int main()16 {17 // 用双向链表作堆栈的底层结构18 stack
> s; 19 // 堆栈未满,元素才能入栈20 if (s.size() < STACK_SIZE)21 s.push(68);22 if (s.size() < STACK_SIZE)23 s.push(1);24 if (s.size() < STACK_SIZE)25 s.push(17);26 // 元素出栈27 while (!s.empty())28 {29 // 打印 17 1 6830 cout << s.top() << endl;31 s.pop();32 }33 34 return 0;35 }

 

 

----------------------- stack 小结
    堆栈是一种应用非常广泛的数据结构。C++ STL 将这种数据结构和它若干受限制操作用泛型类 stack 容器封装出来,包括堆栈初始化、元素入栈、取栈顶元素、元素出栈、判断堆栈是否非空和取得当前堆栈大小等,应用起来十分容易。
    stack的元素出栈操作是不返回栈顶元素的,需要另外通过取栈顶函数获得。这种分离实现是考虑到出栈函数若直接返回栈顶元素,将会导致返回值的数据引用安全问题或不必要的低效复制函数的调用。
    
    从 stack 内部实现看,stack 堆栈是不设最大容量的,但可通过 size 函数获取当前堆栈的大小,以判断是否允许继续让元素入栈,实现具有最大容量限制的堆栈。

 

转载于:https://www.cnblogs.com/music-liang/archive/2013/04/10/3011701.html

你可能感兴趣的文章
Oracle 12c dataguard云上挖坑记--为某机场贵宾业务部署oracle 12c到云端
查看>>
前端开发在不久的将来定会成为主导
查看>>
jQuery内ready与load事件的区别
查看>>
[笔记].关于Stratix III使用非易失加密后,无法正常配置启动的问题探讨
查看>>
一个通用的单元测试框架的思考和设计03-实现篇-核心类源码
查看>>
万能导出数据到Excel
查看>>
[感谢坑娘][回忆3年前]茜色的终点线....
查看>>
减少垃圾广告 让你的电子邮箱更安全
查看>>
载入史册 改变IT安全历程的十大里程碑
查看>>
UVA 624 CD
查看>>
Windows phone 7: DataBinding and UI Refresh系列教程
查看>>
矩阵快速幂 学习笔记
查看>>
linux iconv 批量转码
查看>>
使用MongoDB的GridFS保存用户文件的折腾日记
查看>>
Linux的Find使用
查看>>
ios开发工程师笔试基础题
查看>>
基于Struts构建新闻发布系统
查看>>
基于Struts实现用户登录和注册模块
查看>>
CentOS安装Apache
查看>>
C++ getline函数的使用
查看>>