栈和队列
2019.3.13
参考资料:数据结构与算法,解学武,http://data.biancheng.net/
个人记录重要的笔记,非全原创,有copy部分。
栈
栈的实现
栈的具体实现有两种方式:
- 顺序栈:顺序存储结构(数组);
- 链栈:链表实现;
顺序栈
入栈和出栈
- 空栈时,栈顶指针 top= -1;
- 出栈操作时,只需要top-1即可,元素入栈时会覆盖已被删除的栈元素内容,间接达到删除作用。
栈的应用举例
- 浏览器 “回退” 功能的实现,底层使用的就是栈存储结构。
- 还可以帮我们检测代码中的括号匹配问题
- 以实现数值的进制转换功能
链栈
链栈实际上是一个只能采用头插法插入或删除数据的链表
- 链表的头部是栈顶
- 入栈操作时,需要将数据从链表的头部插入;
- 出栈操作时,需要删除链表头部的首元节点;
队列
队列的实现
队列实现有两种方式:
- 顺序队列:在顺序表的基础上实现
- 链队列:在链表的基础上实现
顺序队列
整个顺序队列在数据不断地进队出队过程中,在顺序表中的位置会因为top和bottom不断+1操作而不断后移。顺序队列整体后移造成的影响是:
- 顺序队列之前的数组存储空间将无法再被使用,造成了空间浪费;
- 如果顺序表申请的空间不足够大,则直接造成程序中数组 a 溢出,产生溢出错误;
改良顺序队列:采用环状顺序队列
- front不再直接 +1,而是+1后同max进行比较,如果=max,则直接跳转到 a[0] 。
- 使用此方法需要注意的是,顺序队列在判断数组是否已满时,出现下面情况:
当队列为空时,队列的头指针等于队列的尾指针;
当数组满员时,队列的头指针等于队列的尾指针; -
- 最简单的解决办法是:牺牲掉数组中的一个存储空间,判断数组满员的条件是:尾指针的下一个位置和头指针相遇,就说明数组满了
链表队列
入队
- 将准备插入的数据元素打造成一个新节点(加入指针并指向null);
- 与 rear 指针指向的节点(队尾节点)的指针指向新节点;
- rear 指针指向该新节点;
出队
- 通过 top 指针直接找到队头节点(队头节点是空的)
- 创建一个新指针 p 并将队头节点的指针赋值给p;
- 将 p 节点(即要出队的队头节点)从链表中摘除:p节点的指针赋值给top指向的队头节点的指针;
- 释放节点 p,回收其所占的内存空间;
- 将队头元素做出队操作时,需提前判断队列中是否还有元素,如果没有,要提示用户无法做出队操作,保证程序的健壮性。