数据结构--栈和队列

这里写目录标题

  • 栈和队列
    • 定义和特点
    • 案例引入
    • 定义和特点
    • 栈的表示
    • 栈的实现--顺序存储结构
      • 表示
      • 基本操作的实现
        • 初始化
        • 判断栈是否为空
        • 求顺序栈长度
        • 清空顺序栈
        • 销毁顺序栈
        • 顺序栈的入栈
        • 顺序栈的出栈
    • 栈的实现--链式存储结构
      • 表示
      • 基本操作的实现
        • 初始化
        • 判断链表是否为空
        • 链栈的入栈
        • 链栈的出栈
        • 取栈顶元素
    • 栈与递归
  • 队列
    • 定义和特点
    • 表示
    • 顺序存储结构的实现与操作
      • 基本操作的实现(顺序表)
        • 入队与出队
        • 队列的小问题----假上溢
        • 区别队空与队满
        • 初始化
        • 求队列长度
        • 循环队列入队
        • 循环队列出队
        • 取队头元素
      • 链式存储结构的实现与操作
        • 表示
        • 基本操作的实现
          • 初始化
          • 链队列的销毁
          • 入队
          • 出队
          • 取队头元素

栈和队列

定义和特点

数据结构--栈和队列_第1张图片
栈和队列都是线性表,是插入和删除位置受限制的线性表

栈的特点是后进先出,表现在代码上就是:插入只能从最后插入,删除只能从最后删除
队列的特点是先进先出,表现在代码上就是:插入只能从最后插入,删除只能从前面删除

数据结构--栈和队列_第2张图片

案例引入

数据结构--栈和队列_第3张图片
数据结构--栈和队列_第4张图片
后进先出,实现倒序

数据结构--栈和队列_第5张图片
先入栈的后匹配


利用栈的特点,可以实现表达式优先级的设置

定义和特点


数据结构--栈和队列_第6张图片
数据结构--栈和队列_第7张图片
栈顶正在准备指引a3加入

数据结构--栈和队列_第8张图片
可以在入栈时穿插出栈,就可以达到不同的效果,但是不可能有cba这种情况,因为c要想先出来,那么ab就要先进去,那么最后只能cba顺序

栈与一般线性表的不同
数据结构--栈和队列_第9张图片

栈的表示

数据结构--栈和队列_第10张图片
抽象数据类型的定义

其中 基本操作包括:

栈的实现–顺序存储结构

表示


top指针真正指向的是栈顶元素之上的地址,方便后续操作
stacksize可表示栈可使用的最大容量

数据结构--栈和队列_第11张图片

基本操作的实现

初始化

数据结构--栈和队列_第12张图片
注意 同一个数组中的指针相减,得到的是两个指针所指元素相差的元素个数,也就相当于下标相减
数据结构--栈和队列_第13张图片
首先定义一个栈的数据 封装成一个结构体

这里S是结构体的具体对象,之后的操作都是利用S来调用数据,

S.base=new …
该行的意思是分配一个MAXSIZE长度的数组空间(c++语法)

注意,指针和数组,可以看成一回事

判断栈是否为空

数据结构--栈和队列_第14张图片

求顺序栈长度

数据结构--栈和队列_第15张图片

清空顺序栈

数据结构--栈和队列_第16张图片
直接将top指针指向base指针即可,因为哪怕定义空顺序栈时,我们也不知道每个元素的内容是否为空,随机分配闲置的地址而已

销毁顺序栈

数据结构--栈和队列_第17张图片

顺序栈的入栈

数据结构--栈和队列_第18张图片

顺序栈的出栈

数据结构--栈和队列_第19张图片
对于图中简化代码部分,–S.top是每回合将top指针下移,前面有个*,是调用下移后的指针

栈的实现–链式存储结构

表示


头指针直接指向栈顶结点
并且没有头结点

左边代码最后一行与上面几行结构体的定义无关,而是创建了一个类的对象S,并且是以指针形式,创建了一个指针S
注意,头指针的名字就可以是链栈的名字,也就是,S可以说是此链栈,也可以说是该链栈的头指针

基本操作的实现

初始化

数据结构--栈和队列_第20张图片
指针置空,等待插入结点

判断链表是否为空

数据结构--栈和队列_第21张图片
如果头指针还处于置空状态,那么就是空链栈

链栈的入栈

数据结构--栈和队列_第22张图片
注意最后要将p指针赋值给s指针,不然就把链栈修改了(因为头指针被改,那么链栈的名字也就是改变了,也就是链表被改了)

链栈的出栈

数据结构--栈和队列_第23张图片

取栈顶元素

数据结构--栈和队列_第24张图片

栈与递归

队列

定义和特点

数据结构--栈和队列_第25张图片

表示



数据结构--栈和队列_第26张图片
这里头尾指针只是逻辑命名,实际上就是两个整数,用来表示操作元素的下标

顺序存储结构的实现与操作

基本操作的实现(顺序表)

入队与出队

数据结构--栈和队列_第27张图片
入队:直接移动”代指针“(用整数变量来表示数组下表从而发挥类似于指针的作用)来插入元素,并将尾指针移动到下一个位置待命
出队:直接移动“代指针”来丢弃元素,移动头指针丢掉元素

队列的小问题----假上溢

数据结构--栈和队列_第28张图片
这样,一个队列,只能用满一次,存在假溢出问题

解决方案:利用取余运算,实现循环使用

对指针加一之后的数进行取余:%(maxsize),这样,就可以将指针从头开始循环,具体操作如下

数据结构--栈和队列_第29张图片

区别队空与队满

数据结构--栈和队列_第30张图片
队空与队满都是front==rear

解决方案
数据结构--栈和队列_第31张图片
我们就规定,剩余一个元素不使用,当有n-1个元素时,就认为,队列已满,这样,队满的判断条件就与队空区别开来

初始化

数据结构--栈和队列_第32张图片
数据结构--栈和队列_第33张图片

求队列长度

数据结构--栈和队列_第34张图片
尾指针减去头指针再加上maxqsize 最后括上括号 对 maxqsize取余

循环队列入队

数据结构--栈和队列_第35张图片

循环队列出队

数据结构--栈和队列_第36张图片

取队头元素

数据结构--栈和队列_第37张图片

链式存储结构的实现与操作

表示

数据结构--栈和队列_第38张图片
左边定义的是结点元素的结构,右边定义的是一条链表的结构,注意,链表结构定义的是非指针类型,所以调用的时候,用“.”来调用

基本操作的实现

初始化

数据结构--栈和队列_第39张图片

链队列的销毁

数据结构--栈和队列_第40张图片

入队

数据结构--栈和队列_第41张图片
注意,定义一个新结点时,指向该结点的新指针也随之定义了,例如上面第一行代码中的p,就是新结点的指针

出队

数据结构--栈和队列_第42张图片
数据结构--栈和队列_第43张图片

取队头元素

数据结构--栈和队列_第44张图片

你可能感兴趣的:(数据结构)