一,概述

1,队列是线性表的特例。它将元素排成队列,有入口(队尾)和出口(队头),数据元素只能从队尾入队,从队头离队。所以队列有先进先出后进后出的特点。
2,生活中有许多问题可以用队列来描述,比如食堂打饭,银行排号等。
3,在程序设计中,也经常使用队列记录一些需要按照先进先出方式处理的数据,例如键盘缓冲区,操作系统的作业调度。

二,队列的概念

队列是另一种限定存取位置的线性表。它允许在表的一段插入,在另一端删除,其中允许插入的一端称为队尾(Rear),允许删除的一端,称为对头(Front)。从队尾删除插入元素的操作称为入队;从队头删除元素的操作,称为出队。

三,代码的实现

package com.atguigu.queue;import java.util.Scanner;public class ArrayQueueDemo {public static void main(String[] args) {//测试ArrayQueue queue=new ArrayQueue(3);char key=' ';//接收用户输入Scanner scaner=new Scanner(System.in);boolean loop=true;while(loop){System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据到队列");System.out.println("g(get):从队列取出数据");System.out.println("h(head):查重队列头数据");key=scaner.next().charAt(0);//接收一个字符switch(key){case 's':queue.showQueue();break;   case 'a':System.out.println("输入一个数");int value=scaner.nextInt();queue.addQueue(value);break;case 'g'://取出数据try {int res=queue.getQueue();System.out.printf("取出的数据是%d\n",res);} catch (Exception e) {// TODO: handle exceptionSystem.out.println(e.getMessage());}break;case 'h'://查看队列头的数据try {int res=queue.headQueue();System.out.printf("队列头的数据是%d\n",res);} catch (Exception e) {// TODO: handle exceptionSystem.out.println(e.getMessage());}case 'e'://退出scaner.close();loop=false;break;default:break;}}System.out.println("程序退出");}}
//使用数组模拟队列-编写一个ArrayQueue类class ArrayQueue{private int maxSize;//表示数组的最大容量private int front;//队列头private int rear;//队列尾private int []arr;//该数组用于存放数据,模拟队列//创建队列的构造器public ArrayQueue(int arrMaxSize){maxSize=arrMaxSize;arr=new int[maxSize];front=-1;//指向队列头部,分析出front是指向队列头部的前一个位置rear=-1;//指向队列尾,指向队列尾的数据(即就是队列最后一个数据)}//判断队列是否满public boolean isFull(){return rear==maxSize-1;}//判读队列是否为空public boolean isEmpty(){return rear==front;}//添加数据到队列public void addQueue(int n){//判断队列是否满if(isFull()){System.out.println("队列满,不能加人数据");return;}rear++;//让rear后移arr[rear]=n;//}//获取队列的数据,出队列public int getQueue(){//判断队列是否空if(isEmpty()){//通过抛出异常throw new RuntimeException("队列为空,不能取数据");}front++;//front后移return arr[front];}//显示所有的队列public void showQueue(){//遍历if(isEmpty()){System.out.println("队列空的,没有数据");return;}for (int i=0;i<arr.length;i++){System.out.printf("arr[%d]=%d\n",i,arr[i]);}}//显示队列的头数据,注意不是取数据public int headQueue(){if(isEmpty()){throw new RuntimeException("队列为空,不能取数据"); }return arr[front+1];}}

四 队列的弊端(引出循环队列)

当rear大于容量时,新元素将无法入队,但事实上队列的低端任有空闲的存储单元,这种现象称为假溢。因此为了充分利用存储空间,对队列的的存储方式进行了一定的改进解决“假溢”现象,因此产生了循环队列。
循环队列主要通过取摸运算,来解决。

package com.atguigu.queue;import java.util.Scanner;public class CircleArrayQueue {public static void main(String[] args) {System.out.println("测试数组模拟环形队列");CircleArray circlequeue=new CircleArray(6);char key=' ';//接收用户输入Scanner scaner=new Scanner(System.in);boolean loop=true;while(loop){System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据到队列");System.out.println("g(get):从队列取出数据");System.out.println("h(head):查看队列头数据");key=scaner.next().charAt(0);//接收一个字符switch(key){case 's':circlequeue.showQueue();break;    case 'a':System.out.println("输入一个数");int value=scaner.nextInt();circlequeue.addQueue(value);break;case 'g'://取出数据try {int res=circlequeue.getQueue();System.out.printf("取出的数据是%d\n",res);} catch (Exception e) {// TODO: handle exceptionSystem.out.println(e.getMessage());}break;case 'h'://查看队列头的数据try {int res=circlequeue.headQueue();System.out.printf("队列头的数据是%d\n",res);} catch (Exception e) {// TODO: handle exceptionSystem.out.println(e.getMessage());}case 'e'://退出scaner.close();loop=false;break;default:break;}}System.out.println("程序退出");}}class CircleArray{private int maxSize;//表示数组的最大容量//front 变量的含义做了一个调整:front就是指向队列的第一个元素,也就是说arr[font]就是队列的第一个元素,//front的初试值=0private int front;//rear 变量的含义做一个调整:rear指向队列的最后一个元素的最后一个位置,因为希望空出一个空间作为约定//rear的初试值=0private int rear;//队列尾private int []arr;//该数组用于存放数据,模拟队列public CircleArray(int arrMaxSize){maxSize=arrMaxSize;arr=new int[maxSize];}//判断队列是否满public boolean isFull(){return (rear+1)%maxSize==front;}//判断队列是否为空public boolean isEmpty(){return rear==front;}//添加数据public void addQueue(int n){//判断队列是否满if(isFull()){System.out.println("队列满,不能加入数据");}//直接将数据加入arr[rear]=n;rear=(rear+1)%maxSize;}//获取队列的数据,出队列public int getQueue(){//判断队列是否空if(isEmpty()){//通过抛出异常throw new RuntimeException("队列空,不能取数据");}//这里要分析出front是指向队列的第一个元素//1,先把front的对应的值保存到一个零时变量//2,将font后移,考虑取模//3,将临时保存的变量返回int value=arr[front];front=(front+1)%maxSize;return value;}//显示队列的所有数据public void showQueue(){//遍历if(isEmpty()){//通过抛出异常throw new RuntimeException("队列空,没有数据");}//思路:从front遍历,遍历多少个元素for(int i=front;i<size();i++){System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);}}//求出当前队列有效数据的个数public int size(){//rear=1,front=0,maxSize=3return (rear+maxSize-front)%maxSize;}//显示头元素//显示队列的头数据,注意不是取数据public int headQueue(){if(isEmpty()){throw new RuntimeException("队列为空,不能取数据"); }return arr[front];}
}

Java数据结构:队列(数组实现)相关推荐

  1. 第七周--数据结构--队列数组

     /*    *第七周--数据结构--队列数组     *Copyright (c) 2015 烟台大学计算机与控制工程学院    *All right reserved.    *文件名称:li ...

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

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

  3. java数据结构之数组

    数据结构对我们的程序员也是非常重要的,相当于一个基础学科,从今天开始,咱们再重新学习一下数据结构吧 1,首先我们要定义一下泛型,初始化成员变量,声明构造方法. private T data[];pri ...

  4. 数据结构-队列-数组队列

    自定义队列 文章目录 自定义队列 数组队列 简述: 数组环形队列 数组队列 简述: 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大 ...

  5. 数据结构--队列(数组)的一种实现

    单向队列(数组实现) package mainimport ("errors""fmt""os" )//队列是一种重要的数据结构,应用也相对 ...

  6. c++/c/java数据结构--队列

    队列的介绍 队列(Queue),是一种线性存储结构.它有以下几个特点: (01) 队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的. ...

  7. java数据结构队列杨辉三角_使用队列实现杨辉三角

    使用队列实现杨辉三角 杨辉三角的特点: 除了第一行,其他行两端都为1: 从第三行开始可以看出,除了两端,其中每个数都是元素本身上面对着的两个数的和: 奇数行有奇数个数,偶数行有偶数个数,都是n个数 每 ...

  8. Java数据结构-基于数组的栈和泛型

    泛型可以参数化变量的类型 当你需要用不同类型的基本类型变量来调用构造方法时你需要泛型 public class Test {public static void main(String[] args) ...

  9. java数据结构队列杨辉三角_数据结构之队列——输出杨辉三角形

    定义 队列是一种操作受限的线性表,只允许在一端进行插入,另一端进行删除.插入的一端称为队尾,删除的一端称为队头,由于这样的限制,所以队列具有先进先出的特性,因此队列也是一种先进先出的线性表. 顺序存储 ...

  10. Java数据结构——队列

    //================================================= // File Name : Queue_demo //-------------------- ...

最新文章

  1. linux救援模式无法识别分区,Linux操作系统出现严重故障后的救援模式
  2. python计算特征的统计值并文本输出
  3. java base64 压缩_在线等(急)Base64(带压缩)出问题
  4. 自编码网络这样应用到任务上可以吗
  5. java编程中的断言工具类(org.springframework.util.Assert)
  6. 旷视南京研究院2020年校招开启!
  7. 新一代互联网巨头老板,最大方谁抠门?
  8. Windows VS2017 编译 libssh2 1.7.0(执行命令、文件上传、下载)
  9. mybatis使用oracle自动生成主键
  10. ActivityMQ应用详解
  11. BN(Batch Normalization)层原理与作用
  12. java机房温度监测的仿真_基于三维仿真的数据中心机房监控可视化管理
  13. html中单元格向下合并单元格,html中单元格合并 HTML 怎么给合并单元格设置宽度...
  14. 用原始代码制作简易的百度页面
  15. MVC实现局部视图刷新
  16. 毒你没商量!DOC病毒原理完全解析(转)
  17. Dreamweaver CS4 快捷键大全
  18. CCNA+NP学习笔记—交换网络篇
  19. Android 手势操作GestureDetector
  20. 如何在mysql 中建立有关联关系的表

热门文章

  1. Vue路由传参三种方式
  2. 【Vue】路由传参方式
  3. 安化云台山风景区,赏景赏月赏星星,来一场新兴的帐篷之旅
  4. 个人邮箱登陆,邮箱登录入口有哪些?有移动办公app吗?
  5. c语言直角坐标系与大地坐标系转换,空间直角坐标系与大地坐标系转换程序
  6. 物联卡中心:快手上买物联卡是真的吗?小心陷入“骗局”!
  7. 换掉 UUID,更快更安全!
  8. java计算机毕业设计健康饮食信息管理系统源码+mysql数据库+系统+lw文档+部署
  9. MySQL通过binglog日志恢复删除数据
  10. 对象头结构(mark-word、Klass Pointer)、指针压缩、锁竞争,源码解毒、还远本地!