03数组模拟环形队列(没有明白)

1,对数组模拟队列的优化,充分利用数组,因此将数组看做是一个环形的(通过取模的方式来实现)

2,分析说明:

  ①尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意 (rear+1) % maxSize == front   满

  ②rear == front   空

  ③思路如下:

    1,front变量的含义做一个调整,front就指向队列的第一个元素,front的初始值是0

    2,rear便令的含义做一个调整,rear指向队列最后一个元素的后一个位置,因为希望空出一个空间作为约定,rear的初始值是0

    3,当队列满时,条件是 (rear+1) % maxSize == front ;

    4,当队列空时,条件是 rear == front

    5,  队列中有效的数据个数是 (rear+maxSize-front) % maxSize

3,代码实现

  1 package DataStructures01;
  2
  3 import java.util.Scanner;
  4
  5 import javax.print.attribute.Size2DSyntax;
  6
  7 public class CircleArrayQueue {
  8     public static void main(String[] args) {
  9         //测试
 10         //创建一个环形队列
 11         ArrayQueueCircle queueCircle=new ArrayQueueCircle(4);//设置为4,这个队列的有效数据最大为3
 12         Scanner s= new  Scanner(System.in);
 13         char key=‘ ‘;
 14         boolean loop=true;
 15         while(loop) {
 16             System.out.println("a(add):添加数据到队列中");
 17             System.out.println("g(get):从队列中取出数据");
 18             System.out.println("h(head):从队列中取出第一个数据");
 19             System.out.println("s(show):查看队列中的所有数据");
 20             key=s.next().charAt(0);
 21             switch(key) {
 22             case ‘a‘:
 23                 System.out.println("请输入一个数添加到队列中:");
 24                 int value=s.nextInt();
 25                 queueCircle.addQueue(value);
 26                 break;
 27             case ‘g‘:
 28                 try {
 29                     System.out.println("从队列中取出的数据是:" +queueCircle.getQueue());
 30                 }
 31                 catch(Exception e){
 32                     System.out.println(e.getMessage());
 33                 }
 34                 break;
 35             case ‘h‘:
 36                 try {
 37                     System.out.println("队列中的第一个数据是:" +queueCircle.headQueue());
 38                 }
 39                 catch(Exception e){
 40                     System.out.println(e.getMessage());
 41                 }
 42                 break;
 43             case ‘s‘:
 44                 queueCircle.showQueue();
 45                 break;
 46             case ‘e‘:
 47                 s.close();
 48                 loop=false;
 49                 break;
 50             default:
 51                 break;
 52             }
 53         }
 54         System.out.println("---退出程序----");
 55     }
 56
 57 }
 58
 59 class ArrayQueueCircle{
 60     private int front;//front变量的韩式做一个调整,front就指向队列的第一个元素,也就是说,arr[front]就是队列的第一个元素,front的初始值是0
 61     private int rear;//队列尾,rear的含义做一个调整,rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间做约定,rear的初始值是0
 62     private int maxSize;//表示数组的最大容量
 63     private int[] arr;
 64
 65     public ArrayQueueCircle(int max) {
 66         maxSize=max;
 67         front=0;
 68         rear=0;
 69         arr=new int[maxSize];
 70     }
 71
 72     //判断是否满
 73     public boolean isFull() {
 74         return (rear+1)%maxSize==front;
 75     }
 76     //判断是否空
 77     public boolean isEmpty() {
 78         return rear==front;
 79     }
 80     //添加数据到队列中
 81     public void addQueue(int n) {
 82         if(isFull()) {
 83             System.out.println("队列中数据已满,不能添加了");
 84             return;
 85         }
 86         arr[rear]=n;//直接将数据加入队列中
 87         rear=(rear+1)%maxSize;//直接将rear后移,这里必须考虑取模
 88     }
 89     //从队列中取出数据,出队列
 90     public int getQueue() {
 91         if(isEmpty()) {
 92             throw new RuntimeException("队列是空的,无法取出数据");
 93         }
 94         //这里需要分析出front是否指向队列的第一个元素
 95         //1,先把front对应的值保留到一个临时变量
 96         //2,将front后移,考虑取模
 97         //3,将临时保存的变量返回
 98         int value=arr[front];
 99         front=(front+1) %maxSize;
100         return value;
101     }
102     //显示队列的头数据,注意不是取出数据
103     public int headQueue() {
104         if(isEmpty()) {
105             throw new RuntimeException("队列是空的,无法取出第一个数据");
106         }
107         return arr[front];
108     }
109     //查看队列中的所有数据
110     public void showQueue() {
111         if(isEmpty()) {
112             System.out.println("队列是空的,无法查看队列中的所有数据");
113             return;
114         }
115         //思路,从front开始遍历,遍历多少个元素
116         for(int i=front;i<front+size();i++) {
117             System.out.printf("arr[%d]=%d\n", i%maxSize,arr[i%maxSize]);
118         }
119     }
120     //求出当前队列有效数据的个数
121     public int size() {
122         return (rear+maxSize-front) % maxSize;
123     }
124 }

控制台打印结果

a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据

a
请输入一个数添加到队列中:
1
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
a
请输入一个数添加到队列中:
2
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
a
请输入一个数添加到队列中:
3
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
a
请输入一个数添加到队列中:
4
队列中数据已满,不能添加了
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
s
arr[0]=1
arr[1]=2
arr[2]=3
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
g
从队列中取出的数据是:1
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
g
从队列中取出的数据是:2
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
s
arr[2]=3
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
a
请输入一个数添加到队列中:
5
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
a
请输入一个数添加到队列中:
6
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
s
arr[2]=3
arr[3]=5
arr[0]=6
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
h
队列中的第一个数据是:3
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
h
队列中的第一个数据是:3
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
s
arr[2]=3
arr[3]=5
arr[0]=6
a(add):添加数据到队列中
g(get):从队列中取出数据
h(head):从队列中取出第一个数据
s(show):查看队列中的所有数据
e
---退出程序----

原文地址:https://www.cnblogs.com/shanlu0000/p/12239049.html

时间: 2024-10-08 16:43:20

03数组模拟环形队列(没有明白)的相关文章

数组模拟环形队列

1.为什么要用环形队列? 2.数组模拟环形队列 3.代码实现 package com.queue; import java.util.Scanner; /** * 数组模拟环形队列 * @author nidegui * @create 2019-10-24 11:33 */ public class CircleQueue { public static void main(String[] args) { System.out.println("测试环形队列的案列"); Circl

队列——使用数组模拟环形队列

一.思路分析 上一篇讲到用数组模拟队列,数组无法复用,下面讲解了用数组模拟环形队列的方法,采用取模的方式,使得数组可以重复使用. 首先先对front和rear的含义做了一个调整,front指向队列的第一个元素,rear指向队列最后一个元素的后一个位置.队列满的条件是(rear +1) % maxSize = front ,其中maxSize表示队列的容量.假如maxSize=10, 牺牲掉一个位置,front = 0,此时若rear = 9,队列就已经满了.队列为空的条件是rear == fro

队列篇之使用数组模拟一个队列

队列是一个有序列表, 可以使用数组实现, 也可以使用链表实现 队列遵守先进先出的原则 1. 下面使用数组模拟一个队列 public class ArrayQueueDemo { public static void main(String[] args) { ArrayQueue queue = new ArrayQueue(3); queue.add(1); queue.show(); System.out.println("-----------------"); queue.ad

稀疏数组与环形数组

数据结构与算法的关系 数据结构(data structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构可以编写出跟家漂亮,更加有效率的代码 要学好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决 程序=数据结构+算法 数据结构是算法的基础,换言之,想要学好算法,需要把数据结构学到位 数据结构包括:线性结构和非线性结构 线性结构: 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系(a[0]=30) 线性结构有两种不同的存储结构,即顺

队列和环形队列

队列 队列的一个使用场景 银行排队的案例: 银行柜台都有人办理业务时,后面来的人,就要进行抽号排队(先来的人号肯定在前面). 有人业务办理完后,柜台会进行叫号(从最前面的号开始叫). 队列介绍 队列是一个有序列表,可以用数组或者链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的数据要后取出. 示意图:(使用数组模拟队列示意图) 数组模拟队列思路 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图, 其中maxSize是该队列的最大容量. 因为队列

【Weiss】【第03章】练习3.25:数组模拟队列

[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空间有限,入队需要检测数组是否已经满 ②.数组经过几次操作后,rear可能绕回front前面,所以许多操作都要用模来实现. 测试代码: 1 #include <iostream> 2 #include "queue.h" 3 using namespace std; 4 usin

数组模拟队列

数组模拟队列 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图.其中,maxSize 是该队列的最大容量. 因为队列的输出.输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标, front 会随着数据输出而改变,而 rear 则是随着数据输入而改变.如图所示: 当将数据存入队列时称为 “addQueue”,addQueue 的处理需要有两个步骤:思路分析: (1)将尾指针往后移:rear+1,当 front == rear

队列(数组模拟)

//队列(数组模拟) class Queue{ private int[] queue; //队列函数 int length; int head; //头指针 int tail; //尾指针 int num; //丢列中元素个数 public Queue(){ } public Queue(int s){ //构造队列函数 length=s; queue=new int[length]; //s为队列长度 head=0; tail=-1; num=0; } public void inQueue

单片机模块化程序: 数据缓存封包-环形队列实现

前言 在上一节只是稍微说了下数据缓存 https://www.cnblogs.com/yangfengwu/p/11769059.html 这节为了可以让大家直接应用起来,我封装了下. 咱们平时发送数据的时候最希望的是可以有个缓存,每次把要发送的数据存到缓存里面 需要发送的时候咱就去缓存里面去取 而且咱希望咱的缓存可以存储多条数据 发送的时候按照先进先出的原则把数据提取出来发出去 使用说明 一,注意,这一节是对上一节的封装,请先看上一节 不过LoopList做了下改动 然后增加了 BufferM