数据结构与算法_03队列

  • 队列
    • 0、章节重点整理
    • 1、认识队列
      • 1.1、 队列的工作运算
      • 1.2、队列的数组实现
      • 1.3、队列的链表实现
    • 2、队列的应用
      • 2.1、环形队列
      • 2.2、双向队列

队列

0、章节重点整理

  • 队列和堆栈都是有序表,抽象型数据类型,所有的加入删除都在不同的两端,符合FIFO特性
  • 何为多重队列?定义及目的
    双向队列就是一种二重队列。只是队列的首端可在队列的左右两端。多重队列的原则是只要遵循数据的插入在rear 端,删除在front 端的原则,并将多重堆栈的T(i) 改成rear(i)、B(i) 改成front(i)即可。多重队列也可以改成多重环形队列。主要目的是让数组的有效使用率提高,因为数组的大小必须事先声明。
  • 何为优先队列
    是一种不必遵守队列特性FIFO 的有序表,其中每一个元素都赋予了优先权,加入元素时可任意加入。但是拥有最高优先权的数据优先输出。

1、认识队列

1.1、 队列的工作运算

  • 先进先出
  • 两种基本操作,加入和删除,使用front 和rear 两个指针来分别指向队列的前端和尾端

1.2、队列的数组实现

//默认front 从-1开始,数组的索引是0开始。public static int front = -1,rear = -1,max = 20;public static int val;public static char ch;public static int queue[] = new int[max];//创建容量20的数组public static void main(String args[]) throws IOException {String strM;int M=0;BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));while(rear < max-1 && M != 3){System.out.print("[1]存入一个数值[2]取出一个数值[3]结束: ");strM=keyin.readLine();M=Integer.parseInt(strM);switch(M){case 1:System.out.print("\n[请输入数值]: ");strM=keyin.readLine();val=Integer.parseInt(strM);rear++;queue[rear]=val;break;case 2:if(rear>front){front++;System.out.print("\n[取出数值为]: ["+queue[front]+"]"+"\n");queue[front]=0;}else{System.out.print("\n[队列已经空了]\n");break;}break;default:System.out.print("\n");break;}}if(rear == max-1) System.out.print("队列已经满了]\n");System.out.print("\n[目前队列中的数据]:");if (front >= rear) {System.out.print("没有\n");System.out.print("[队列已经空了]\n");}else {while (rear > front) {front++;System.out.print("["+queue[front]+"]");}System.out.print("\n");}}

1.3、队列的链表实现

class QueueNode {// 队列节点类int data;                    // 节点数据QueueNode next;              // 指向下一个节点//构造函数public QueueNode(int data){this.data = data;next = null;}
}class Linked_List_Queue {//队列类public QueueNode front; //队列的前端指针public QueueNode rear;  //队列的尾端指针//构造函数public Linked_List_Queue() { front=null; rear=null; }//方法enqueue:队列数据的存入public boolean enqueue(int value) {QueueNode node= new QueueNode(value); //建立节点//检查是否为空队列if (rear==null)front=node; //新建立的节点成为第一个节点elserear.next=node; //将节点加入到队列的尾端rear=node; //将队列的尾端指针指向新加入的节点return true;}//方法dequeue:队列数据的取出public int dequeue() {int value;//检查队列是否为空队列if (!(front==null)) {if(front==rear) rear=null;value=front.data; //将队列数据取出front=front.next; //将队列的前端指针指向下一个return value;}else return -1;}
} //队列类声明结束public class  Test02{// 主程序public static void main(String args[]) throws IOException {Linked_List_Queue queue =new Linked_List_Queue(); //建立队列对象int temp;System.out.println("以链表来实现队列");System.out.println("====================================");System.out.println("在队列前端加入第1个数据,此数据值为1");queue.enqueue(1);System.out.println("在队列前端加入第2个数据,此数据值为3");queue.enqueue(3);System.out.println("在队列前端加入第3个数据,此数据值为5");queue.enqueue(5);System.out.println("在队列前端加入第4个数据,此数据值为7");queue.enqueue(7);System.out.println("在队列前端加入第5个数据,此数据值为9");queue.enqueue(9);System.out.println("====================================");while (true) {if (!(queue.front==null)) {temp=queue.dequeue();System.out.println("从队列前端依序取出的元素数据值为:"+temp);}elsebreak;}System.out.println();}
}

2、队列的应用

  • 图形遍历的先广后深搜索法BFS,就是利用队列
  • 计算机的模拟;模拟过程由于各种事件的输入时间不一定,利用队列反映真实情况
  • CPU工作调度利用队列处理,可以达到先到先做的要求

2.1、环形队列

  • 是一种环形结构的队列,是Q(0:n-1)的一维数组,同时Q(0) 也是Q(n-1)的下一个元素
  • 指针front 永远以逆时针方向指向队列中第一个元素的前一个位置,rear 则指向队列当前的最后位置。一开始二者都设置为-1,表示空队列,当front = rear则为空队列。
public static int front = -1,rear = -1,val;public static int queue[] = new int[5];public static void main(String args[]) throws IOException{String strM;BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));while(rear < 5 && val != -1){System.out.print("请输入一个值以存入队列,要取出值请输入0。(结束输入-1):");strM = keyin.readLine();val = Integer.parseInt(strM);if(val == 0){if(front==rear){System.out.print("[队列已经空了]\n");break;}front++;if (front == 5)front = 0;System.out.print("取出队列值["+queue[front]+"]\n");queue[front] = 0;}else if(val != -1 && rear < 5){if(rear+1 == front||rear == 4&&front <= 0){System.out.print("[队列已经满了]\n");break;}rear++;if(rear == 5)rear = 0;queue[rear] = val;}}System.out.print("\n队列剩余数据:\n");if (front == rear)System.out.print("队列已空!!\n");else{while(front != rear){front++;if (front == 5)front = 0;System.out.print("["+queue[front]+"]");queue[front] = 0;}}System.out.print("\n");}

2.2、双向队列

class QueueNode {              // 队列节点类int data;                    // 节点数据QueueNode next;              // 指向下一个节点//构造函数public QueueNode(int data) {this.data = data;next = null;}
}public class Linked_List_Queue { //队列类public QueueNode front; //队列的前端指针public QueueNode rear;  //队列的尾端指针//构造函数public Linked_List_Queue() {front = null;rear = null;}//方法enqueue:队列数据的存入public boolean enqueue(int value) {QueueNode node = new QueueNode(value); //建立节点//检查是否为空队列if (rear == null)front = node; //新建立的节点成为第一个节点elserear.next = node; //将节点加入到队列的尾端rear = node; //将队列的尾端指针指向新加入的节点return true;}//方法dequeue:队列数据的取出public int dequeue(int action) {int value;QueueNode tempNode, startNode;//从前端取出数据if (!(front == null) && action == 1) {if (front == rear) rear = null;value = front.data; //将队列数据从前端取出front = front.next; //将队列的前端指针指向下一个return value;}//从尾端取出数据else if (!(rear == null) && action == 2) {startNode = front;  //先记下前端的指针值value = rear.data;  //取出目前尾端的数据//找寻最尾端节点的前一个节点tempNode = front;while (front.next != rear && front.next != null) {front = front.next;tempNode = front;}front = startNode;  //记录从尾端取出数据后的队列前端指针rear = tempNode;    //记录从尾端取出数据后的队列尾端指针//下一行程序是指当队列中仅剩下最后节点时,取出数据后便将front及rear指向nullif ((front.next == null) || (rear.next == null)) {front = null;rear = null;}return value;} else return -1;}
} //队列类声明结束public class DoublyQueue {// 主程序public static void main(String args[]) throws IOException {Linked_List_Queue queue =new Linked_List_Queue(); //建立队列对象int temp;System.out.println("以链表来实现双向队列");System.out.println("====================================");System.out.println("在双向队列前端加入第1个数据,此数据值为1");queue.enqueue(1);System.out.println("在双向队列前端加入第2个数据,此数据值为3");queue.enqueue(3);System.out.println("在双向队列前端加入第3个数据,此数据值为5");queue.enqueue(5);System.out.println("在双向队列前端加入第4个数据,此数据值为7");queue.enqueue(7);System.out.println("在双向队列前端加入第5个数据,此数据值为9");queue.enqueue(9);System.out.println("====================================");temp=queue.dequeue(1);System.out.println("从双向队列前端依序取出的元素数据值为:"+temp);temp=queue.dequeue(2);System.out.println("从双向队列尾端依序取出的元素数据值为:"+temp);temp=queue.dequeue(1);System.out.println("从双向队列前端依序取出的元素数据值为:"+temp);temp=queue.dequeue(2);System.out.println("从双向队列尾端依序取出的元素数据值为:"+temp);temp=queue.dequeue(1);System.out.println("从双向队列前端依序取出的元素数据值为:"+temp);System.out.println();}
}

数据结构与算法_03队列相关推荐

  1. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  2. abcde依次进入一个队列_数据结构与算法(6):队列

    (文中图片出自王争老师的课程:数据结构与算法之美,侵删) 先进者先出,这就是典型的队列. 根据上篇文章,我们知道栈只支持两个基本操作:入栈 push()和出栈 pop().队列跟栈非常相似,支持的操作 ...

  3. 数据结构与算法之-----队列(Queue)

    [ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用 ...

  4. 数据结构与算法:队列——02

    文章目录 三.队列 1.队列概述: 2.单向队列[数组表现形式]: 3.环形队列[数组表现形式]: 三.队列 1.队列概述: 定义: 队列定义 队列简称队,它也是一种操作受限的线性表.其限制为仅允许在 ...

  5. JavaScript 数据结构与算法(队列)

    队列数据结构 队列是遵循先进先出(FIFO,也称为先来先服务)原则的一组有序的项.队列在尾部添加新元素,并从顶部移除元素.最新添加的元素必须排在队列的末尾.在现实中,最常见的队列的例子就是排队. 创建 ...

  6. 数据结构与算法 | 循环队列

    循环队列 实际中我们还会用到一种队列叫做循环队列,这种队列把存储空间前后连接起来,形成像环一样的结构,解决了内存空间浪费的问题 这里我们用顺序结构来实现,因为为了防止溢出的情况,这里我们需要多开一个数 ...

  7. 数据结构与算法 | 用队列实现栈

    上一章实现了用栈来实现队列,这一次我们试试用队列来实现栈. 因为栈的特性是先进后出,队列是先进先出. 所以我们可以想到用两个队列,一个空队列,一个放数据,当我们入队的时候将数据直接放入非空队列,出队的 ...

  8. JAVA数据结构与算法【队列、数组模拟(环形)队列】

    队列 使用场景:排队 队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 ...

  9. python实现队列_用Python实现的数据结构与算法:队列

    一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行. 二.ADT 队列ADT(抽象数据类型)一般提供以下接口: Qu ...

最新文章

  1. 图片转圈实现_如何编辑图片?
  2. SAP UI5 busy Dialog debug - 单步调试
  3. R语言数据转换——plyr包
  4. 小学计算机课每周几节,小学信息技术课时多少
  5. 就业技术书文件表格_就业申请书
  6. 老黄历小程序源码前端实例(亲测可用)
  7. windows7计算机用户账户,win7系统删除用户账户的方法(图文)
  8. pytorch nn.Module.zero_grad
  9. aaynctask控制多个下载进度_做进度计划一路关卡困难重重?通关攻略了解一下!...
  10. decide your linux OS is GUI or not
  11. 下一个互联网平台还有多远?
  12. 图像识别中——目标分割、目标识别、目标检测和目标跟踪的区别
  13. 服务器安装cos系统,COS(国产操作系统)安装教程
  14. 实验01 使用网络协议分析仪Wireshark分析数据链路层帧结构实验报告
  15. 【北京工业大学申请个人学生邮箱】
  16. 通过 经纬度 获取 地理位置(Python、高德地图)
  17. 如何通俗易懂地阐述机器学习?
  18. 3.4.8nbsp;拉里·佩奇和谢尔盖·布林
  19. 10大最具影响力人物
  20. 失物招领小程序,失物招领微信小程序,校园失物招领小程序系统毕设作品

热门文章

  1. 【Vue】路由传参方式
  2. MySQL入门,第六部分,关系代数
  3. 如何保证产品质量?测试质量管理体系
  4. CarSim仿真快速入门(二十一)-CarSim: 车轮箭头动画和其他指示动画
  5. 芯片热!价格战!争落地!2018年人工智能发展回忆录
  6. Java 集合转数组,数组转集合
  7. webpack---js相关配置
  8. 微信小程序 框架(MINA)
  9. TSNE原理性简单解释
  10. yum下载速度过慢解决方案