数据结构之队列

1.队列的定义

队列(Queue):也是一种运算受限的特殊线性表。其插入和删除操作分别在线性表的两端进行(只允许在表的一端进行插入,而在另一端进行删除)。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)

2.队列的操作

  1. 一般情况下,入队(enqueue)操作又称为队列的插入。
  2. 出队(dequeue)操作又称为队列的删除。

3.队列的运算

队列的基本运算通常和栈的基本运算类似,有以下6种:
① 置空队; //构造一个空队列
② 判队空; //队空返回真,否则返回假。
③ 判队满; //队满返回真,否则返回假,仅限于顺序存储结构。
④ 入队; //队列非满时,从队尾插入元素。
⑤ 出队; //队列非空时,从队首删除元素。
⑥ 取队首元素; //返回队首元素,不修改队首指针。

4.队列的溢出

队列的溢出:队列在顺序存储时,经常出现“假溢出”现象,解决“假溢出”现象的方法有很多种,但通常采用循环队列方式存储。

5.队列抽象数据类型ADT,队列接口

//队列接口,描述队列抽象数据类型,T表示元素类型
public interface Queue<T>
{public abstract boolean isEmpty(); //判空public abstract boolean add(T x); //x入队public abstract T peek(); //返回队头,没有删除public abstract T poll(); //出队,返回队头
}

6.队列的分类

队列的存储具有顺序和链式存储两种,因此队列可分为顺序队列和链式队列

7.队列的表示和实现

在这里插入图片描述

8 顺序队列

定义:队列的顺序存储结构称为顺序队列
假溢出:是指在入队和出队操作中,头尾指针不断增加而不减小或只减小而不增加,致使被删除元素的空间无法重新利用,最后造成队列中有空闲空间,但是不能够插入元素,也不能够删除元素的现象、

9 顺序循环队列(解决假溢出)

定义:将顺序队列设计成在逻辑上首尾相接的循环结构,则可循环使用顺序队列的连续存储单元。

9.1 循环队列的操作

• 入队时:rear=(rear+1)% maxsize
• 出队时:front=(front+1)% mixsize

9.2 顺序循环队列的实现

接口类:

//顺序循环队列类,最终类,实现队列接口,T元素类型
public final class SeqQueue<T> implements Queue<T>
{private Object element[]; //数组private int front, rear; //队列头尾下标public SeqQueue(int capacity)//构造空队列public SeqQueue() //构造空队列public boolean isEmpty(); //判空public boolean add(T x); //x入队public T peek(); //返回队头,没有删除public T poll(); //出队,返回队头
}

接口实现类:

public class SeqQueue<T> {private Object element[]; //存储队列数据元素的数组private int front, rear; //front、rear分别为队列头尾下标public SeqQueue(int length) //构造容量为length的空队列{if (length < 64)length = 64; //设置队列数组容量最小值this.element = new Object[length];this.front = this.rear = 0; //设置空队列}public SeqQueue() //构造默认容量的空队列{this(64);}public boolean isEmpty()//判断队列是否空,若空返回true{return this.front == this.rear;}public boolean add(T x) //元素x入队,空对象不能入队{if (x == null)return false;// throw new NullPointerException("x==null"); //抛出空对象异常if (this.front == (this.rear + 1) % this.element.length) //若队列满,则扩充数组{Object[] temp = this.element;this.element = new Object[temp.length * 2]; //重新申请一个容量更大的数组int j = 0;for (int i = this.front; i != this.rear; i = (i + 1) % temp.length)//按照队列元素次序复制数组元素this.element[j++] = temp[i];this.front = 0;this.rear = j;}this.element[this.rear] = x;this.rear = (this.rear + 1) % this.element.length;return true;}public T peek()//返回队头元素,没有删除。若队列空,则返回null{return this.isEmpty() ? null : (T) this.element[this.front];}public T poll() //出队,返回队头元素,若队列空返回null{if (this.isEmpty())return null;T temp = (T) this.element[this.front];this.front = (this.front + 1) % this.element.length;return temp;}public String toString()//返回队列所有元素的描述字符串,形式为“(,)”,按照队列元素次序{StringBuffer strbuf = new StringBuffer(this.getClass().getName() + "(");for (int i = this.front; i != this.rear; i = (i + 1) % this.element.length)strbuf.append(this.element[i].toString() + ",");//按照队列元素次序复制数组元素strbuf.setCharAt(strbuf.length() - 1, ')');//将串最后多余的一个字符','改为')'return new String(strbuf); //由StringBuffer对象构造String对象}
}

10 链队列

定义:采用链式存储结构的队列,它是一种特殊的线性表,只能对头部和尾部进行操作

10.1 接口实现类
public final class LinkedQueue<T> implements Queue<T>
{private Node<T> front, rear; //队头和队尾结点public LinkedQueue() //构造空队列public boolean isEmpty(); //判空public boolean add(T x); //x入队public T peek(); //返回队头,没有删除public T poll(); //出队,返回队头
}
10.2 接口具体实现类
public class LinkedQueue<T> implements  Queue<T> {private Node<T> front, rear;//front和rear分别指向队头和队尾结点public LinkedQueue()//构造空队列{this.front = this.rear = null;}public boolean isEmpty()//判断队列是否空,若空返回true{return this.front == null && this.rear == null;}public boolean add(T x) //元素x入队,空对象不能入队{if (x == null)return false;// throw new NullPointerException("x==null"); //抛出空对象异常Node<T> q = new Node<T>(x, null);if (this.front == null)this.front = q; //空队插入elsethis.rear.next = q; //队列尾插入this.rear = q;return true;}public T peek()//返回队头元素,没有删除。若队列空,则返回null{return this.isEmpty() ? null : this.front.data;}public T poll() //出队,返回队头元素,若队列空返回null{if (isEmpty())return null;T x = this.front.data; //取得队头元素this.front = this.front.next; //删除队头结点if (this.front == null)this.rear = null;return x;}public String toString()//返回队列所有元素的描述字符串,形式为“(,)”{ //算法同不带头结点的单链表StringBuffer strbuf = new StringBuffer(this.getClass().getName() + "(");for (Node<T> p = this.front; p != null; p = p.next)strbuf.append(p.data.toString() + ",");//按照队列元素次序复制数组元素strbuf.setCharAt(strbuf.length() - 1, ')');//将串最后多余的一个字符','改为')'return new String(strbuf); //由StringBuffer对象构造String对象}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7460.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python读取广州-湛江天气csv文件并做可视化仪表盘

1.读取广-湛.csv文件 import pandas as pd data pd.read_csv(广-湛天气.csv) data 2.去除多余字符 #去除多余字符 data[[最高温度,最低温度]] data[[最高温度,最低温度]].apply(lambda x: x.str.replace(,).replace(, 0)) data.head() 3.删除2023年数据,并计算平均温度保存到…

全网最全,Pytest自动化测试框架 assert 断言使用实战,快速通关

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Pytest与Unittest…

如何让小家电带电池设备快速充满电

如今随着这几年的USB-C PD适配器的普及&#xff0c;消费者手上的PD协议适配器越来越普遍&#xff0c;如何让微软surface 充电器线支持使用PD适配器快充呢&#xff1f;不妨加入一颗受电端PD协议取电芯片——LDR6015 就可以打造一根 PD电源线适配pro7/6/5/4/laptop/book/go Type-…

8.OpenCV-识别身份证号码(Python)

需求描述&#xff1a; 通过OpenCV识别身份证照片上的身份证号码&#xff08;仅识别身份证号码&#xff09; 实现思路&#xff1a; 1.将身份证号中的0,1,2,3,4,5,6,7,8,9作为模板&#xff0c;与身份证照片中的身份证号码区域进行模板匹配。 2.先要制作一个身份证号码模板&am…

基于Ant DesignPro Vue + SpringBoot 前后端分离 - 后端微服化 + 接口网关 + Nacos + Sentinel

基于Ant DesignPro Vue SpringBoot 前后端分离 - 后端微服化 接口网关 Nacos Sentinel 通过Ant DesignPro Vue SpringBoot 搭建的后台管理系统后&#xff0c;实现了前后端分离&#xff0c;并实现了登录认证&#xff0c;认证成功后返回该用户相应权限范围内可见的菜单。 后…

2. 计算点到平面的投影

参考 https://www.cnblogs.com/nobodyzhou/p/6145030.html 所以用各种平面提取算法后&#xff0c;得到的平面方程, 注意此处的平面方程abcd已经是归一化了。 a x b y c z d 0 ax by cz d 0 axbyczd0 此时的原点到该平面点的投影点为 C P ( − a d , − b d , − c …

Linux:DNS服务(bind)

目录 环境 主服务器和从服务器的配置环境 主服务器 从服务器 主DNS配置文件 dns从服务器配置 环境 如果你只需要主dns服务器那么你只需要挑着主dns服务器配置看即可 我这里使用了4台虚拟机&#xff0c;你也可以不使用这么多根据你的电脑性能去调整 他们必须要在同一个网段…

(十九)数据编辑——属性编辑②

数据编辑——属性编辑② 使用键盘输入值并不是编辑表中值的唯一方式。在某些情况下&#xff0c;为了设置字段值&#xff0c;可能要对单条记录甚至是所有记录执行数学计算。ArcMap 中的字段计算器可以对所有或所选记录进行简单和高级计算。 此外&#xff0c;还可以基于字段计算…

每天一点Python——day47

#第四十七天字典生成式&#xff1a;字典生成的公式 a[ab,ac,ad] b[12,13,14] 把a&#xff0c;b列表合并为字典 将第一个列表中的元素作为字典当中的键&#xff0c;第二个列表中的元素作为字典当中的值 这个过程我们需要打包 我们需要使用内置函数zip()生成字典 #如图所示 #例&a…

基于深度学习的高精度塑料瓶检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度塑料瓶检测识别系统可用于日常生活中或野外来检测与定位塑料瓶目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的塑料瓶目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

推荐信模版(英文)计算机专业

推荐信模版&#xff08;英文&#xff09;计算机专业 ✅ 内容已校对 润色 ©️ 文章来源&#xff1a;https://blog.csdn.net/IYXUAN&#xff0c;原创内容&#xff0c;转载请注明&#xff01; 推荐信&#xff08;一&#xff09; January 4, 2023 Dear Admissions Committe…

vue使用mapbox地图

1、下载依赖 npm install --save mapbox-gl mapbox/mapbox-gl-language 2、引入mapBox&#xff0c;将引入的内容封装为js文件 在api/map文件夹下新建mapbox.js文件 代码&#xff1a; import mapboxgl from mapbox-gl import mapbox-gl/dist/mapbox-gl.css import MapboxLang…