2021-9-28 数据结构学习 第四章 - 栈 和 队列【1024Re】

新学期被作业淹没,将博客晾在这太久了,不禁心生惭愧,于是将今晚本来计划去深圳湾公园散步的时间用来写文章。我在想,要写什么呢,看着案上的数据结构,就决定是你了!

看名字是第四章,我是不是错过了什么,其实是正在学栈和队列,剩下的三章会在国庆尽力填坑。

假设大家学过线性表,那么栈和队列就是特殊的线性表罢了。我上一次接触栈,是在汇编语言的学习处,是比较硬件的理解,现在学习数据结构,就是从软件、实用的角度来理解栈。

 上图是栈的模型,栈是允许在同一端进行插入和删除操作的线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。我们已经在汇编中知晓push和pop,压入push是增加数据,而弹出pop是删除数据 ,这些操作只能从栈顶最低地址作为约束的接口界面入手操作 ,但读取栈中的数据是随便的没有接口约束之说。很多人都误解这个理念从而对栈产生困惑。

如果你不能理解栈的模型,那想象一下手枪压膛,先压入的子弹总是最后射出,这就是栈的原理。

考你一个问题:设将整数1、2、3、4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请问一个可以输出多少种结果?

答案是十四种,你可以写出来吗?

ok,我们来康康栈的定义(code)

前面说过,栈本质上是顺序表,那么我们可以用顺序表(链表来实现)但是C++有STL栈容器——stack,极大的方便了我们(相当于人家帮你定义好了)

 stack堆栈容器的C++标准头文件为 stack ,必须用宏语句 "#include <stack>" 包含进来,才可对 stack 堆栈的程序进行编译。

下面是基本使用方法:

堆栈初始化:

1.    stack()
    默认构造函数,创建一个空的 stack 对象。
    例如,下面一行创建一个空的堆栈对象 s 。
    stack<int>  s;
    
   


元素入栈
    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(). 布尔型,返回0或1;
    判断堆栈是否为空,返回 true 表示堆栈已空,false 表示堆栈非空。

感谢:以上内容改自CSDN博主  lyj2014211626  的​​​​​​c++ stl栈容器stack用法介绍 好文:  

​​​​​​c++ stl栈容器stack用法介绍

下面是对每个函数的用法:

//----------------------------------------- 读取堆栈的栈顶元素
#include <stack>
#include <iostream>
using namespace std;
int main()
{
    // 创建堆栈对象
    stack<int> s;
    // 元素入栈
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
    s.push(6);
 
    // 元素依次出栈
    while(!s.empty())
    {
        // 打印栈顶元素
        cout << s.top() << endl;
        // 出栈
        s.pop();
    }
 
    return 0;
}
//检查栈的大小是否可容纳压入元素
#include <stack>
#include <list>
#include <iostream>
#define STACK_SIZE  100   // 堆栈最大容量
using namespace std;
int main()
{
    // 用双向链表作堆栈的底层结构
    stack<int, list<int> >   s; 
    // 堆栈未满,元素才能入栈
    if (s.size() < STACK_SIZE)
        s.push(68);
    if (s.size() < STACK_SIZE)
        s.push(1);
    if (s.size() < STACK_SIZE)
        s.push(17);
    // 元素出栈
    while (!s.empty())
    {
        // 打印 17 1 68
        cout << s.top() << endl;
        s.pop();
    }
 
    return 0;
}

 感谢:以上内容改自CSDN博主  lyj2014211626  的​​​​​​c++ stl栈容器stack用法介绍 好文:  

​​​​​​c++ stl栈容器stack用法介绍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值