数据结构与算法_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. Kinect for Windows V2 SDK+ VS2012 环境搭建
  2. html清除溢出,深入理解CSS overflow:hidden——溢出,坍塌,清除浮动
  3. linux常见紧急情况处理
  4. SharePoint 2010多语言UI,以及开发人员需要注意的
  5. 会议通知|2019暑期全国高校Python数据分析与实训课程高级研修班
  6. matlab求函数方程的正根,matlab解方程组的时候,可以只要正根吗?
  7. 关于python搜题的软件哪个好_搜题用哪个软件好?
  8. 苹果手机signin_苹果iphone弹出sign in to itunes store怎么办
  9. 若依设置匿名访问路径
  10. Kubernetes 污点介绍
  11. (三星)安卓神器xposed框架ROOT使用指南
  12. e盘是否具有读写权限_文件权限管理
  13. 华为研发小仙女自述:我和开发的“撕逼”日常
  14. managed DLL 和 normal DLL
  15. 计算机内存和磁盘的关系
  16. 超级简单小程序点赞功能
  17. 免费拿走Vivado2017.4安装包及其license(附带安装教程)
  18. 个人整理网站外链专用
  19. 编写shell脚本判断当前主机的CPU生产商
  20. 本地电脑与远程服务器之间无法复制粘贴解决方法

热门文章

  1. 小米“AirTag”来了?小米查找物品专利曝光
  2. CAD高版本窗体阵列LISP_高版本CAD如何显示阵列窗口?
  3. 关于SVG图片宽高被锁定无法拉伸问题处理
  4. ASP.NET MVC ---MVC中验证码
  5. 感悟:支付宝和蚂蚁花呗的技术架构及实践
  6. PCB走线角度选择 — PCB Layout 跳坑指南
  7. 前端线上图片生成马赛克
  8. 建议收藏 | 买保险怕上当?8分钟解决你所有疑问
  9. RFID智能档案柜/智能文件流转柜
  10. 创建组groupadd_如何在Linux中创建组– groupadd命令