数据结构——队列

本文详细介绍了队列数据结构,包括队列的含义、简单模型、顺序队列、循环队列,以及Java中队列的API方法。通过实例展示了如何使用Java实现顺序队列和循环队列,最后探讨了队列结构的扩展形式:双端队列和优先级队列。
摘要由CSDN通过智能技术生成

队列的含义

与栈相同,队列也是一种特殊的线性表,也是一种操作受限制的数据结构,它只允许在前段删除数据元素和在后端插入数据元素。删除元素的位置称作队头(head),插入元素的位置称作队尾(tail)。从生活中的角度来理解,平时我们食堂排队、超市排队等,就是一种常见的队列形式。

队列的简单模型

这里写图片描述

顺序队列

创建队列时需要静态分配或动态申请一片连续的存储空间,并设置两个指针对队列进行操作,一个是head指向队头,一个是tail只想队尾。在队头元素出队时,head++,在队尾插入元素时,tail++。
随着元素的不断插入和删除,队列占用的存储空间也在所分配的内存空间上不停的移动,当head等于tail时,表示队列为空,没有任何数据元素。当tail大于分配的空间长度size时,则无法在插入任何元素,但往往还有大量空间没有数据存储,是出队元素曾分配的内存空间,这部分没有被使用。

这就需要提到一个“溢出”的概念:

  1. 下溢:实在队列为空的情况下对队列进行操作。属于正常情况,可以用作判断。
  2. “真上溢”:在队列“满”的情况下,仍对队列进行插入操作,这是可以避免的。
  3. “假上溢”:当队列不断删除、插入操作时,被删除元素曾占有的内存空间被闲置,而队尾指针已经指向了所分配的内存空间之外,这时无法使元素入队,这是一种“假上溢”的现象,可以通过循环队列来解决。

循环队列

循环队列就是为了解决队列中空间浪费现象,即“假上溢”的产生。当队头或者队尾指针超出了队列空间,则将指针指向这片连续存储空间的开始位置,可以通过取余运算,head%size(队列空间的大小)、tail%size来表示,若将普通队列看作一条直线,可以将循环队列看作一个圆,无论怎么进行插入删除操作、数据元素的移动,在非“真上溢”的情况下,都可以进行入队操作,这样的队列就是循环队列。
当队列为空时,head等于tail,当队列满时head也等于tail,所以为了区分这两种情况,在循环队列中规定只能存放size-1个数据元素,当只剩下一个空存储单元时,队列满。在大多数队列的应用都是循环队列。
判空条件:head==tail
判满条件:head==(tail&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值