栈
(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类的底层是由双向链表来实现的,所以它的功能比较强大,即可以当队列,也可以当栈,也可当顺序表
|