数据结构之栈和队列

本文介绍了数据结构中的栈和队列。栈是一种遵循先进后出原则的特殊线性表,常用操作包括压栈和出栈。Java中的Stack类提供了栈的实现。队列则是一种先进先出的数据结构,分为顺序队列和循环队列,循环队列在实现时需要注意判断队列是否为空和满的方法。此外,还提及了双端队列(deque)及其在Java中的LinkedList实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈和队列

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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值