队列

  • 先看队列接口和结点类
  • 1. 顺序队列
  • 2. 循环队列
  • 3. 链队列

先看队列接口和结点类

package com.lovely.queue;/** * 2020年4月26日下午2:42:44* * @author echo lovely**/
public interface IQueue {public void clear(); // 将队列置空public boolean isEmpty(); // 判断队列是否为空public int length(); // 返回队列的数据元素个数public Object peek(); // 返回队首元素 public void offer(Object x) throws Exception; // x插入队列,队尾入队public Object poll(); // 返回队首元素,并删除 队首出队public void display(); // 输出队列中所有数据元素}package com.lovely.linearList;/** * 2020年4月1日下午8:25:10* * @author echo lovely** @category 节点类 用于存数据 和 后继节点*/public class Node {public Object data; // 存放节点数据值public Node next; // 存放后继节点public Node() {this(null, null);}// 只有节点值的构造函数public Node(Object data) {this(data, null);}// 带有节点值和后继节点的构造函数public Node(Object data, Node next) {this.data = data;this.next = next;}
}

1. 顺序队列

package com.lovely.queue;/*** @author echo lovely** 2020年4月26日下午3:03:05* * 队列的顺序储存结构* 队首出队(删除),队尾入队(插入)。*/
public class SeqQueue implements IQueue {private Object[] queueElem; // 队列的储存空间private int maxSize; // 队列的最大储存单元个数private int front; // 指向队首元素private int rear; // 指向队尾元素的下一个元素 // 构造最大储存单元为maxSize的空队列public SeqQueue(int maxSize) {this.maxSize = maxSize;front = rear = 0;queueElem = new Object[maxSize];}@Overridepublic void clear() {// 队列置空front = rear = 0; }@Overridepublic boolean isEmpty() {// 队列是否为空      return front == rear;}@Overridepublic int length() {// 队列长度return rear - front;}@Overridepublic Object peek() {// 返回队首元素if (isEmpty())return null;return queueElem[front];}@Overridepublic void offer(Object x) throws Exception {// 队尾入队if (rear == maxSize)throw new Exception("队列已满");queueElem[rear] = x;rear ++; // 指向队尾的下一个元素}@Overridepublic Object poll() {// 出队 只不过是不显示罢了if (isEmpty())return null;front ++; // 指向原来队首元素的下一个元素return queueElem[front];}@Overridepublic void display() {if (!isEmpty()) {for (int i = front; i < rear; i++) {System.out.print(queueElem[i] + "\t");}} elseSystem.out.println("队列为空!");}}
  • 测试
package com.lovely.queue;public class TestSeqQueue {public static void main(String[] args) {// 顺序队列SeqQueue sq = new SeqQueue(6);try {// 入队sq.offer(1);sq.offer(2);sq.offer(3);sq.offer(4);} catch (Exception e) {e.printStackTrace();}System.out.println("队列长度 " + sq.length());Object obj = sq.poll();System.out.println(obj + "出队后,长度 " + sq.length());System.out.println("队首元素:" + sq.peek());sq.display();/*      这里有问题,多次入队出队操作,造成有存储空间却不能进行入队操作的"假溢出"现象try {sq.offer(88);sq.offer(88);sq.poll();sq.poll();sq.offer(88);sq.poll();} catch (Exception e) {e.printStackTrace();}System.out.println("\n长度 " + sq.length());sq.display();*//*
队列长度 4
2出队后,长度 3
队首元素:2
2   3   4
*/}}

2. 循环队列

package com.lovely.queue;/*** * @author echo lovely** 2020年5月19日下午8:53:03* * 循环顺序队列* 顺序队列的多次入队和出队 会造成有储存空间 却不能进行入队操作的假溢出现象。*/
public class CircleSeqQueue {private Object[] queueElem; // 队列的储存空间private int front; // 指向队首元素private int rear; // 指向队尾元素的下一个储存元素private int maxSize; // 队列的最大储存单元个数// 构造最大储存单位个数为maxSize的空队列public CircleSeqQueue(int maxSize) {front = rear = 0;queueElem = new Object[maxSize];this.maxSize = maxSize;}// 将队列置空public void clear() {front = rear = 0;}// 判断队列是否为空public boolean isEmpty() {return front == rear;}// 队列的长度public int length() {return (rear - front + maxSize) % maxSize; }// 读取队首元素public Object peek() {if (isEmpty())return null;return queueElem[front];}// 入队public void offer(Object x) throws Exception {if ((rear + 1) % maxSize == front) throw new Exception("队列已满");queueElem[rear] = x;rear = (rear + 1) % maxSize;}// 出队public Object poll() {if (rear == front)return null;Object p = queueElem[front];front = (front + 1) % maxSize;return p;}// 遍历队列public void display() {if (!isEmpty()) {for (int i = 0; i < rear; i = (i + 1) % maxSize) {System.out.print(queueElem[i] + " ");}} elseSystem.out.println("此队列为空!");}
}
  • 测试
package com.lovely.queue;public class TestCircleSeqQueue {public static void main(String[] args) {// 构造长度为10的队列CircleSeqQueue csq = new CircleSeqQueue(10);try {csq.offer(1);csq.offer(2);csq.offer(3);csq.offer(4);csq.offer(5);csq.offer(6);} catch (Exception e) {e.printStackTrace();}System.out.println("队首元素:" + csq.peek());System.out.println("出队:" + csq.poll());csq.display();}}/**
队首元素:1
出队:1
2 3 4 5 6
*/

3. 链队列

package com.lovely.queue;import com.lovely.linearList.Node;/*** * @author echo lovely* 2020年6月7日下午7:20:02* * 链队列 * 使用单链表实现* 实现入队队尾 出队队首, 没有中间的插入或者删除* * 无需头节点 , front指向头节点 rear指向队尾结点便可*/
public class LinkQueue implements IQueue {private Node front; // 队首指针private Node rear; // 队尾指针// 构造空队列public LinkQueue() {front = rear = null;}public void clear() {front = rear = null;}public boolean isEmpty() {// 队首是否为空return front == null;}@Overridepublic int length() {Node p = front;int length = 0;while (p != null) {p = p.next;length ++;}return length;}// 返回队首元素值public Object peek() {if (isEmpty()) return null;return front.data;}@Overridepublic void offer(Object x) throws Exception {// 入队Node s = new Node(x);if (!isEmpty()) { // 队列非空rear.next = s;rear = s;} else front = rear = s;}// 出队public Object poll() {if (front == null)return null;Node p = front;front = front.next;if (p == rear) {rear = null; // 删除结点为队尾结点时需要修改rear}return p.data;}public void display() {if (!isEmpty()) {for(Node p = front;p != null;p = p.next) {System.out.print(p.data + "\t");}System.out.println();} else {System.out.println("此队列为空");}}}
  • 测试
package com.lovely.queue;public class TestLinkQueue {public static void main(String[] args) {// 链队列的增删改查LinkQueue lq = new LinkQueue();try {lq.offer(2);lq.offer(3);lq.offer(5);lq.offer(7);lq.offer(11);} catch (Exception e) {e.printStackTrace();}System.out.println("入队的队列:");lq.display();System.out.println("队首元素:" + lq.peek());System.out.println("队首出队:" + lq.poll());lq.display();System.out.println("队列的长度为:" + lq.length());}}/**
入队的队列:
2   3   5   7   11
队首元素:2
队首出队:2
3   5   7   11
队列的长度为:4*/

顺序队列,循环队列,链队列相关推荐

  1. 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)

    目录 一.顺序队列 1.存储结构 2.入队和出队 总代码 二.循环队列 总代码: 三.链队列 1.存储结构 2.入队和出队 总代码 一.顺序队列 队列特征:先进后出.后进后出. 1.存储结构 //队列 ...

  2. 数据结构 队列(顺序队列 循环队列 链队列)

    目录 一.引入 二.队列的定义 三.队列的抽象数据类型 四.队列的存储方式 五.队列的顺序存储(不太常用 后面5.4会给出原因) 5.1顺序存储队列的基本知识点 5.2队列的顺序存储描述 5.3顺序存 ...

  3. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

  4. 顺序队列,链队列的基本操作

    顺序队列,链队列的基本操作 一.实验目的 1.深入了解队列的定义和特性. 2.掌握队列的数组表示.链表表示以及相应操作的实现,巩固对这两种结构的构造方法的掌握. 3. 会灵活运用队列结构解决某些实际问 ...

  5. 【数据结构】队列(链队列、循环队列)的存储结构及基本运算(C语言)

    目录 1. 队列基本概念 2. 链队列 2.1 代码+注释 2.2 运行结果 3. 循环队列 3.1 代码+注释 3.2 运行结果 1. 队列基本概念 队列(Queue)是一种限定性线性表,它只允许在 ...

  6. c语言循环队列入列算法,C语言——循环队列和链队列的基本运算

    // 循环队列 #include #include "SeqQue.h" // 循环队列的基本运算 /* const int maxsize = 20; typedef struc ...

  7. 【笔记 】栈底层 循环队列的处理 链栈 链队列

    栈 队列 解决"假溢出"问题的方法: 采用循环队列方式:将数组的头尾看作是相邻的元素, 即将元素data[0]看作是data[maxlen-1]的下一个元素.如图所示. 因此,插入 ...

  8. Java实现队列(循环队列,链队列)

    循环队列: package SeqQueue;public class Queue {private int data[];private int queueSize;private int fron ...

  9. 【数据结构与算法】循环队列和链队列的比较

    前言 本文原本是一篇随感+笔记,被翻出来后就整理发了博客. 不曾想能上搜索头条,既如此,决定更新一下,加上必要的阐释,避免影响有需求的读者. (我这么理解大家,如果有需要的话,是不是可以考虑点个赞或者 ...

最新文章

  1. HTML初级知识点总结(1.0)
  2. Linux 文件夹含义(转)
  3. linux系统测试报告,[Linux-文件系统测试] -- Bonnie++测试
  4. CGImageRef 图片压缩 裁减
  5. matlab系统的初始条件,指定总线信号的初始条件
  6. 360私有云平台Elasticsearch服务初探
  7. mysql case quchong_处理mysql的查询语句去重案例一则
  8. ASE(Asset Scan Engine)资产扫描器
  9. 时间序列预测 | Python实现GAN时间序列数据生成建模
  10. 终于搞清楚了:java的long的小l和大L区别
  11. vector实现 并交差 集实例
  12. 磁盘管理看不到硬盘的恢复办法
  13. 机工士姆斯塔迪奥分数 20作者 DAI, Longao单位 杭州百腾教育科技有限公司
  14. uni-app 省市区选择器
  15. 伯通过计算机网络,用于互联的计算机网络的安全系统
  16. python marshal loads failed_Python模块学习:marshal 对象的序列化
  17. 简易四六级刷题网站(一键帮你对答案)
  18. 技术分享|数据分析与可视化
  19. 计算机竞赛进省队可以保送吗,厉害!物理竞赛8名学子入选省队!信息学竞赛5人获清北保送资格,他们来自……...
  20. 高性能mysql学习笔记--复制

热门文章

  1. 前端学习(601):集成react插件
  2. 前端学习(495):嵌入代码与外部文件和文档模式
  3. spring学习(6):使用xml方式实现spring基本应用
  4. java学习(126):throw向上抛出异常
  5. 实例43:python
  6. 实例33:python
  7. 机场精细化管理_宇视科技智慧机坪解决方案助力机场实现精细化管理
  8. 大型企业用什么orm_生产企业ERP有什么用
  9. zabbix入门之定义触发器
  10. 百度经验 回享计划