数据结构与算法—队列

1. 队列的定义:

队列(Queue )简称队,是一种操作受限制 的线性表 ,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队; 删除元素称为出队或离队。操作特性是先进先出(First In First Out,FIFO)。
队头(Front):允许删除的一端;
队尾(Rear):允许插入的一端。
空队列:不含任何元素的空表。

2. 队列的顺序存储:

队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针front指向队头元素,队尾指针rear指向队尾元素的下一个位置。
初始状态(队空条件):front==rear=-1。
进队操作:队不满时,先送值到队尾元素,再将队尾指针加1。
出队操作:队不空时,先取队头元素值,再将队头指针加1。
队满状态:rear == maxSize - 1

数组模拟队列的顺序存储代码实现:

import java.util.Scanner;public class ArrayQueue {public static void main(String[] args) {//创建一个队列ArrayQueues queue = new ArrayQueues(4);//接收用户输入char key = ' ';Scanner scanner = 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 = scanner.next().charAt(0);switch (key) {//查看所有队列数据case 's':queue.listQueue();break;//添加数据case 'a':System.out.println("输出一个数");int value = scanner.nextInt();queue.addQueue(value);break;//取出数据case 'g':try {int res = queue.getQueue();System.out.println("取出的数据是:" + res);} catch (Exception e) {System.out.println(e.getMessage());}break;//查看头数据case 'h':try {int res = queue.headQueue();System.out.println("取出的数据是:" + res);} catch (Exception e) {System.out.println(e.getMessage());}break;//退出case 'e':scanner.close();loop = false;break;default:break;}}System.out.println("程序退出咯!");}
}class ArrayQueues {//数组的最大容量private int maxSize;//队列头部private int front;//队列尾部private int rear;//存放数据,模拟队列private int[] arr;//创建构造器public ArrayQueues(int arrMaxSize) {maxSize = arrMaxSize;//指向队列头部,指向队列头的前一个位置front = -1;//指向队列尾,指向队列尾部数据(队列最后一个数据)rear = -1;arr = new int[maxSize];}//判断队列是否满public boolean isFull() {return rear == maxSize - 1;}//判断队列是否空public boolean isEmpty() {return rear == front;}//添加数据到队列中public void addQueue(int n) {//判断队列是否满if (isFull()) {//如果队列满,抛出异常throw new RuntimeException("队列满,不能添加数据");}//rear后移rear++;arr[rear] = n;}//获取队列中的数据,出队列public int getQueue() {//判断队列是否为空if (isEmpty()) {//如果队列空,抛出异常throw new RuntimeException("队列空,不能获取数据");}//front后移front++;return arr[front];}//显示队列所有数据public void listQueue() {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];}}

问题分析:队列的顺序存储存在“假溢出”,在数组中仍然存在可以存放元素的空位置,但是队列显示队满。

3. 循环队列:

把存储队列元素从逻辑上视为一个环,称为循环队列,利用除法取余来实现(%)。
初始时:front=rear=0。
队满条件:front == (rear + 1) % maxSize。
队空条件:front==rear=0。
队列中元素个数:(rear + maxSize - front) % maxSize。
队首指针进1:(front + 1) % maxSize。
队尾指针进1:(rear + 1) % maxSize。

数组模拟循环队列代码实现:

import java.util.Scanner;/*** @program: DataStructures* @description: 环形队列* @author: zc* @create: 2020-11-24 20:01**/
public class CircleArrayQueue {public static void main(String[] args) {//创建一个队列CircleArray queue = new CircleArray(3);//接收用户输入char key = ' ';Scanner scanner = 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 = scanner.next().charAt(0);switch (key) {//查看所有队列数据case 's':queue.listQueue();break;//添加数据case 'a':System.out.println("输出一个数");int value = scanner.nextInt();queue.addQueue(value);break;//取出数据case 'g':try {int res = queue.getQueue();System.out.println("取出的数据是:" + res);} catch (Exception e) {System.out.println(e.getMessage());}break;//查看头数据case 'h':try {int res = queue.headQueue();System.out.println("取出的数据是:" + res);} catch (Exception e) {System.out.println(e.getMessage());}break;//退出case 'e':scanner.close();loop = false;break;default:break;}}System.out.println("程序退出咯!");}
}class CircleArray{//表示数组的最大容量private int maxSize;//front指向队列的第一个元素, front初始值为0private int front;//rear指向队列的最后一个元素的后一个位置,空出一个空间作为约定, rear初始值为0private int rear;//存放数据,模拟队列private int[] arr;public CircleArray(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];//front、rear默认值为0,此处不写}//判断队列是否为满public boolean isFull() {return front == (rear + 1) % maxSize;}//判断队列是否为空public boolean isEmpty() {return front == rear;}//添加数据到队列中public void addQueue(int n) {//判断队列是否为满if (isFull()) {System.out.println("队列已满,不能加入数据!");return;}//直接将数据加入arr[rear] = n;//将rear后移rear = (rear + 1) % maxSize;}//获取队列的值,出队列public int getQueue() {//判断队列是否为空if (isEmpty()) {throw new RuntimeException("队列为空,不能取数据!");}int value = arr[front];front = (front + 1) % maxSize;return value;}//显示所有的数据信息public void listQueue() {//遍历,判断是否为空if (isEmpty()) {System.out.println("队列为空,没有数据!");return;}for (int i = front; i < front+size(); i++) {System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);}}//求出队列的数据的个数public int size() {return (rear + maxSize - front) % maxSize;}//显示队列头的信息public int headQueue() {//判断if (isEmpty()) {throw new RuntimeException("队列为空,没有数据!");}return arr[front];}
}

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

  1. JavaScript数据结构与算法——队列详解(下)

    接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...

  2. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  3. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列详解

    前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...

  4. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列图文详解

    前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...

  5. Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)

    Airport Simulation 是数据结构与算法教材中用于演示Queue的一个小程序(大多数教师似乎会跳过这个练习).主程序会通过输入总的运行时间.队列里可以等待的最多飞机数量,平均每个时间单元 ...

  6. JavaScript数据结构与算法——队列详解(上)

    队列基本知识 队列是一种与列表很像的数据结构,只是队列只能在尾部插入元素,在队首删除元素.队列用于存放按顺序排列的元素,先进先出,就像食堂排队一样,后来的只能排在后面,先来的先拿饭,一种井然有序的感觉 ...

  7. 数据结构与算法 / 队列(queue)

    @time 2019-08-04 @author Ruo_Xiao 一.定义 队列是一种操作受限的线性表,只能从一端插入从另一端弹出的数据结构. 二.特性 先进者先出,后进者后出. 三.分类 1.基于 ...

  8. 数据结构与算法 | 队列

    队列 队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性,就如同我们排队一样,先排的就先出去. 而进行插入的一端叫做队尾,进行删除的一端叫做队头 队列可以用 ...

  9. (三)数据结构与算法-队列

    银行排队案例 队列介绍 队列是一个有序列表,可以用数组或是链表来实现 遵循先入先出原则.即:先存入队列的数据,要先取出.后存入的要后取出 数组模拟队列 队列本身是有序表,若使用数组的结构来存储队列的数 ...

最新文章

  1. python3.8.0shell_Python 3.8.0 正式发布 更新内容
  2. 小议WebRTC拥塞控制算法:GCC介绍
  3. 大数据技术hadoop入门级生态圈介绍
  4. 跨数据库调用存储过程权限问题
  5. React 与 可视化
  6. 这个耳机一点不输千元级的AirPods
  7. linux 漏洞 poc,CVE-2017-11176: 一步一步linux内核漏洞利用 (二)(PoC)
  8. Csdn Blog 开发团队致广大网友的一封信
  9. html 标题栏小图标 ,锚点,视频插入,音乐插入
  10. C#网络编程之---TCP协议的同步通信(相互发送接收数据)
  11. You need to use a Theme.AppCompat theme (or descendant) with this activity
  12. BZOJ3091 城市旅行
  13. PCB天线和陶瓷天线
  14. windows 服务器cpu使占用高的原因分析与解决办法
  15. 计算机图像处理之形状变换
  16. 生命旅程中何生命个体
  17. Storport MSI (Message Signaled Interrupts)
  18. oracle agile培训资料,敏捷基础知识培训.pdf
  19. Ubuntu鼠标一直闪烁,win10鼠标正常
  20. 人工智能(网络爬虫)

热门文章

  1. 为甚serve 修改dev不能跑_初探逆向将电缆调制解调器改装为SDR
  2. python 字典代码_Python 字典(Dictionary)
  3. oracle可视化工具IB,oracle小记:dba_data_files
  4. task_struct源码
  5. mysql填加序列号(仿照oracle row_number函数)
  6. Docker入门系列之二:使用dockerfile制作包含指定web应用的镜像
  7. 用ElasticSearch搭建自己的搜索和分析引擎
  8. centos6.5命令安装redis并设置redis自启动,可远程连接
  9. MapReduce1和Yarn的工作机制
  10. javascript中apply、call和bind的区别