数组模拟队列

数组模拟队列

  队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图。其中,maxSize 是该队列的最大容量。

  因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标, front 会随着数据输出而改变,而 rear 则是随着数据输入而改变。如图所示:

  

  当将数据存入队列时称为 “addQueue”,addQueue 的处理需要有两个步骤:思路分析:

    (1)将尾指针往后移:rear+1,当 front == rear 【空】

    (2)若尾指针 rear 小于 队列的最大小标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。rear == maxSize-1【队列满】

  代码实现:

  1 public class ArrayQueueDemo {
  2
  3     public static void main(String[] args) {
  4         // 测试
  5         // 创建一个队列
  6         ArrayQueue queue = new ArrayQueue(3);
  7         char key = ‘ ‘; // 接收用户输入
  8         Scanner scanner = new Scanner(System.in);
  9         boolean loop = true;
 10
 11         // 输出一个菜单
 12         while(loop) {
 13             System.out.println("s(show):显示队列");
 14             System.out.println("e(exit):退出程序");
 15             System.out.println("a(add):添加数据到队列");
 16             System.out.println("g(get):从队列取出数据");
 17             System.out.println("h(head):查看队列头数据");
 18
 19             key = scanner.next().charAt(0); // 接收一个字符
 20             switch (key) {
 21             case ‘s‘:
 22                 queue.showQueue();
 23                 break;
 24             case ‘a‘:
 25                 System.out.println("输入一个数");
 26                 int value = scanner.nextInt();
 27                 queue.addQueue(value);
 28                 break;
 29             case ‘g‘:
 30                 try {
 31                     int res = queue.getQueue();
 32                     System.out.printf("取出的数据是%d\n",res);
 33                 } catch (Exception e) {
 34                     System.out.println(e.getMessage());
 35                 }
 36                 break;
 37             case ‘h‘:
 38                 try {
 39                     int res = queue.headQueue();
 40                     System.out.printf("队列头的数据是%d\n",res);
 41                 } catch (Exception e) {
 42                     System.out.println(e.getMessage());
 43                 }
 44             case ‘e‘:
 45                 scanner.close();
 46                 loop = false;
 47                 break;
 48             default:
 49                 break;
 50             }
 51         }
 52         System.out.println("程序结束");
 53     }
 54
 55 }
 56
 57 // 使用数组模拟队列-编写一个ArrayQueue 类
 58 class ArrayQueue {
 59     private int maxSize; // 表示数组的最大容量
 60     private int front; // 指向队列头
 61     private int rear; // 指向队列尾
 62     private int[] arr; // 该数据用来存放数据,模拟队列
 63
 64     // 创建队列的构造方法
 65     public ArrayQueue(int arrMaxSize) {
 66         maxSize = arrMaxSize;
 67         arr = new int[maxSize];
 68         front = -1; // 指向队列头部,分析出 front 是指向队列头的前一个位置
 69         rear = -1; // 指向队列尾,指向队列尾的数据(即就是队列最后一个数据)
 70     }
 71
 72     // 判断队列是否满
 73     public boolean isFull() {
 74         return rear == maxSize - 1;
 75     }
 76
 77     // 判断队列是否为空
 78     public boolean isEmpty() {
 79         return rear == front;
 80     }
 81
 82     // 添加数据到队列
 83     public void addQueue(int n) {
 84         // 判断队列是否满
 85         if (isFull()) {
 86             System.out.println("队列已满,不能加入数据");
 87             return;
 88         }
 89         rear++; // 让 rear 后移
 90         arr[rear] = n;
 91     }
 92
 93     // 获取队列的数据,出队列
 94     public int getQueue() {
 95         // 判断队列是否空
 96         if (isEmpty()) {
 97             // 通过抛出异常
 98             throw new RuntimeException("队列空,不能取数据");
 99         }
100         front++;
101         return arr[front];
102     }
103
104     // 显示队列的所有数据
105     public void showQueue() {
106         // 遍历数组
107         if (isEmpty()) {
108             System.out.println("队列为空,没有数据");
109             return;
110         }
111
112         for (int i = 0; i < arr.length; i++) {
113             System.out.printf("arr[%d]=%d\n", i, arr[i]);
114         }
115     }
116
117     // 显示队列的头数据,不是取出数据
118     public int headQueue() {
119         if (isEmpty()) {
120             throw new RuntimeException("队列为空,没有数据");
121         }
122         return arr[front + 1];
123     }
124
125 }

  问题分析并优化:

    (1)目前数组使用一次就不能使用,没有达到复用的效果。

    (2)将这个数组使用算法,改进成一个环形的数组。

原文地址:https://www.cnblogs.com/niujifei/p/11550025.html

时间: 2024-10-09 04:37:37

数组模拟队列的相关文章

【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

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

1,对数组模拟队列的优化,充分利用数组,因此将数组看做是一个环形的(通过取模的方式来实现) 2,分析说明: ①尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意 (rear+1) % maxSize == front   满 ②rear == front   空 ③思路如下: 1,front变量的含义做一个调整,front就指向队列的第一个元素,front的初始值是0 2,rear便令的含义做一个调整,rear指向队列最后一个元素的后一个位置,因为

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

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

数据结构与算法—稀疏数组和队列

目录 稀疏数组和队列 1.稀疏数组 1.1 解决方法 1.2 代码实现 2. 队列 2.1 数组模拟队列 2.2 数组模拟环形队列 稀疏数组和队列 1.稀疏数组 所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用.因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据.OK,如果你不明白,那我们来看一个例子. ? 在一个五子棋中,有存盘和续上盘的功能 分析问题:因为该二维数组的很多默认值是 0,因此记录了很多

java 数据结构 用数组实现队列

代码内容 1 package com.structure; 2 3 import java.util.Scanner; 4 5 /** 6 * @auther::9527 7 * @Description: 数组模拟队列 8 * @program: jstl2 9 * @create: 2019-10-05 08:58 10 */ 11 public class ArrayQueueDemo { 12 public static void main(String[] args) { 13 Sca

稀疏数组和队列

一.数据结构的分型 数据结构包括线性结构和非线性结构 线性结构: 1.线性结构是最常见的数据结构,其特点是数据元素之间一对一的线性关系 2.线性结构有两种不同的存储结构(数组)和链式存储结构(链表),顺序存储的线性表称为顺序表,顺序表中存储的元素是连续的 3.链式存储的表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息 4.线性结构常见的有:数组,队列,链表和栈 非线性结构: 包括二维数组,多维数组,广义表,图结构,树结构 二.稀疏数组 当一个数组中大部分元

队列(数组模拟)

//队列(数组模拟) 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

数组模拟环形队列

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

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

队列是一个有序列表, 可以使用数组实现, 也可以使用链表实现 队列遵守先进先出的原则 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