数据结构学习笔记③·栈&队列

栈和队列

2019.3.13
参考资料:数据结构与算法,解学武,http://data.biancheng.net/
个人记录重要的笔记,非全原创,有copy部分。

栈的实现

栈的具体实现有两种方式:

  1. 顺序栈:顺序存储结构(数组);
  2. 链栈:链表实现;

顺序栈

入栈和出栈
  1. 空栈时,栈顶指针 top= -1
  2. 出栈操作时,只需要top-1即可,元素入栈时会覆盖已被删除的栈元素内容,间接达到删除作用。

栈的应用举例

  • 浏览器 “回退” 功能的实现,底层使用的就是栈存储结构。
  • 还可以帮我们检测代码中的括号匹配问题
  • 以实现数值的进制转换功能

链栈

链栈实际上是一个只能采用头插法插入或删除数据的链表

  1. 链表的头部是栈顶
  2. 入栈操作时,需要将数据从链表的头部插入;
  3. 出栈操作时,需要删除链表头部的首元节点;

队列

队列的实现

队列实现有两种方式:

  1. 顺序队列:在顺序表的基础上实现
  2. 链队列:在链表的基础上实现
顺序队列

整个顺序队列在数据不断地进队出队过程中,在顺序表中的位置会因为top和bottom不断+1操作而不断后移。顺序队列整体后移造成的影响是:

  • 顺序队列之前的数组存储空间将无法再被使用,造成了空间浪费;
  • 如果顺序表申请的空间不足够大,则直接造成程序中数组 a 溢出,产生溢出错误;
改良顺序队列:采用环状顺序队列
  • front不再直接 +1,而是+1后同max进行比较,如果=max,则直接跳转到 a[0] 。
  • 使用此方法需要注意的是,顺序队列在判断数组是否已满时,出现下面情况:
    当队列为空时,队列的头指针等于队列的尾指针;
    当数组满员时,队列的头指针等于队列的尾指针;
    • 最简单的解决办法是:牺牲掉数组中的一个存储空间,判断数组满员的条件是:尾指针的下一个位置和头指针相遇,就说明数组满了
链表队列
入队
  1. 将准备插入的数据元素打造成一个新节点(加入指针并指向null);
  2. 与 rear 指针指向的节点(队尾节点)的指针指向新节点;
  3. rear 指针指向该新节点;
出队
  1. 通过 top 指针直接找到队头节点(队头节点是空的)
  2. 创建一个新指针 p 并将队头节点的指针赋值给p;
  3. 将 p 节点(即要出队的队头节点)从链表中摘除:p节点的指针赋值给top指向的队头节点的指针;
  4. 释放节点 p,回收其所占的内存空间;
  • 将队头元素做出队操作时,需提前判断队列中是否还有元素,如果没有,要提示用户无法做出队操作,保证程序的健壮性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值