栈
(1)概念:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素 操作。
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底
(2)栈中的元素遵循先进后出的原则
(3)所以说,只要满足元素遵循先进后出的原则,那么这种数据结构都叫做栈,不管你底层是用数组或者链表实现,他们都叫做栈。
(4)压栈和出栈的简单示意图
(4)Java中有一个给使用者写好的栈----->Stack类
(5)Stack类中的方法
模拟实现栈(Stack类)数组版本
(6)总结:栈的元素是从栈顶压栈到栈底,从栈顶获取栈中的元素,所以就会出现元素先进后出的特点
队列
(1)概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头
(2)队列的示意图:
(3)队列的特点:队列元素先进先出,后进后出
(4)不管数据结构的底层是由链表或者数组来实现的,只要满足元素先进先出,后进后出,那么这个数据结构就是队列
(5)队列有顺序对列和循环队列
顺序队列的模拟(底层使用单链表)
循环队列
实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。
底层使用数组来实现队列的时候,我们一般使用循环队列来实现
编写一个循环队列比较难的是出队列和进队列这两部分功能的编写
有两个难点:
一、如何判断循环列表是否为空?
二、如何判断循环列表是满的?
判断循环列表是否为空比较简单—>只要队头和队尾重合就行
解释:队列的删除是对队头进行,每删除一个元素,队头向后移动,只有当队头和队尾重合的时候,队列就只剩一个元素了,所以我们在设计循环队列的时候,可以将队尾多向后移动一位,所以当队头和队尾重合的时候循环队列为空
判断循环列表是满的这个比较难,我提供三种方法:
一、通过设置size变量来记录
二、空一个位置
三、使用标记
循环队列的模拟实现(底层是数组)
这里有循环队列的题,想做可以做一下:
设计循环队列
双端队列
双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。
Java中有给使用者写好一个队列---->LinkedList类
LinkedList类的底层是由双向链表来实现的,所以它的功能比较强大,即可以当队列,也可以当栈,也可当顺序表