环形队列的实现 [详解在代码中]

  1 package DataStructures.Queue.Array.Exerice;
  2 
  3 /**
  4  * @author Loe.
  5  * @project DataStructures&Algorithms
  6  * @date 2023/5/8
  7  * @ClassInfo 环形队列
  8  *            主要使用取模的特性来实现环形特征
  9  */
 10 public class CirularQueue {
 11     //当前队列大小
 12     public int maxSize;
 13     //队列
 14     public int[] queue;
 15     //指向第一个元素
 16     public int front;
 17     //指向最后一个元素的再后一个元素
 18     public int rear;
 19 
 20     public CirularQueue(int maxSize) {
 21         this.maxSize = maxSize;
 22         //创建队列数组
 23         this.queue = new int[maxSize];
 24         //初始化指针
 25         this.front = 0;
 26         this.rear = 0;
 27     }
 28 
 29     public void addQueue(int data){
 30         if (this.isFull()){
 31             System.out.println("队列已满~");
 32 
 33         }else{
 34             //因为real指向的最后一个元素的前一个元素
 35             //所以这里可以直接使用并赋值
 36             //初始化为0可以理解为:
 37             //- 初始化时,最后一个元素的索引是 -1
 38             this.queue[this.rear] = data;
 39 
 40             //解决环形队列问题
 41             //在以往我们需要将rear++
 42             //并且保证rear是小于maxSize即可
 43             //但环形队列需要用一种方法来把 rear 困在 maxSize中
 44             //使其从始至终都无法超过maxSize
 45             //所以我们使用 "取模运算" 来实现
 46             this.rear = (rear + 1) % maxSize;
 47         }
 48     }
 49 
 50     /**
 51      * 取出元素方法
 52      * 在这个方法中我们需要解决 front索引指向的位置问题
 53      * 同 add 一样,我们也需要将front困在maxSize中
 54      */
 55     public int getData(){
 56         //如果为空
 57         if (isEmpty()){
 58             System.out.println("无法取出,队列为空~");
 59         }
 60         //由于我们需要对front进行操作
 61         //所以将front先前指向的值取出,存到一个临时变量中
 62         int upData = this.queue[this.front];
 63 
 64         //接下来对front进行操作
 65         this.front = (this.front + 1) % this.maxSize;
 66 
 67         return upData;
 68     }
 69 
 70 
 71     //展示队列
 72     public void show(){
 73         for (int i = this.front; i < front + size(); i++) {
 74             System.out.printf("队列元素索引[%d]=%d\n",i % this.maxSize,this.queue[i % this.maxSize]);
 75         }
 76     }
 77 
 78 
 79     //判断是否为空
 80     public boolean isFull(){
 81         //队列满的条件是什么?
 82         //以往: rear == maxSize
 83         //为适配环形队列,条件改为:
 84         //(rear + 1) % maxSize == front
 85         return (this.rear + 1) % maxSize == front;
 86     }
 87 
 88     public boolean isEmpty(){
 89         return this.rear == this.front;
 90     }
 91 
 92     //获取当前队列可用的元素数量
 93     public int size(){
 94         return (rear + maxSize - front) % maxSize;
 95     }
 96 
 97 
 98 
 99     public int getMaxSize() {
100         return maxSize;
101     }
102 
103     public void setMaxSize(int maxSize) {
104         this.maxSize = maxSize;
105     }
106 
107     public int[] getQueue() {
108         return queue;
109     }
110 
111     public void setQueue(int[] queue) {
112         this.queue = queue;
113     }
114 
115     public int getFront() {
116         return front;
117     }
118 
119     public void setFront(int front) {
120         this.front = front;
121     }
122 
123     public int getRear() {
124         return rear;
125     }
126 
127     public void setRear(int rear) {
128         this.rear = rear;
129     }
130 }

 

原文链接:https://www.cnblogs.com/loe-home/p/17382896.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:环形队列的实现 [详解在代码中] - Python技术站

(0)
上一篇 2023年5月5日
下一篇 2023年5月8日

相关文章

  • 【ACM算法竞赛日常训练】DAY5题解与分析【储物点的距离】【糖糖别胡说,我真的不是签到题目】| 前缀和 | 思维

    DAY5共2题: 储物点的距离(前缀和) 糖糖别胡说,我真的不是签到题目(multiset,思维) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eri…

    算法与数据结构 2023年4月18日
    00
  • 详解01背包问题原理与使用方法

    01背包问题详解 问题描述 给定一个背包,其容量为 $C$,现在有 $n$ 个物品,其中第 $i$ 个物品的体积为 $w_i$,价值为 $v_i$。问如何选择物品放入背包中,使得背包中物品的总价值最大。 思路分析 动态规划 这是一个经典的动态规划问题,可以使用动态规划来解决。我们定义 $dp[i][j]$ 表示前 $i$ 个物品中,容量为 $j$ 的背包可获…

    算法 2023年3月27日
    00
  • Python计算开方、立方、圆周率,精确到小数点后任意位的方法

    Python计算开方、立方、圆周率,精确到小数点后任意位的方法 在Python中,计算开方、立方、圆周率以及精确到小数点后任意位的方法多种,下面将分别进行介绍。 1. 计算开方 Python中计算开方可以使用math库中的sqrt函数,也使用幂运算符(**)。 使用math库 import math x = 16 y = math.sqrt(x) print…

    python 2023年5月14日
    00
  • 【JavaScript快速排序算法】不同版本原理分析

    说明 快速排序(QuickSort),又称分区交换排序(partition-exchange sort),简称快排。快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速…

    算法与数据结构 2023年4月18日
    00
  • python回溯算法实现全排列小练习分享

    下面是详细讲解“Python回溯算法实现全排列小练习分享”的完整攻略,包含两个示例说明。 全排列问题 全列问题是一个经典的组合问题,它的目标是找到一组数的所有排列。例如,对于集合{1, 2 3},它的所有排列为{1, 2, 3},{1, 3, 2},{2, 1, 3},{2, 3, 1},{3, 1, 2}和{3, 2,1}。 回溯算法实现 回溯算法是一种递…

    python 2023年5月14日
    00
  • 用C语言实现单链表的各种操作(一)

    “用C语言实现单链表的各种操作(一)”详细介绍了如何通过C语言来实现单链表的常见操作。下面,我会结合该文章的内容,对其进行完整攻略的介绍。 文章的主要内容包括:单链表的定义、单链表的初始化、判断单链表是否为空、获取单链表中元素个数、在链表开头插入元素、在链表末尾插入元素、在链表中间插入元素、删除链表中指定元素、在链表中查找指定元素、链表的反转以及链表的销毁。…

    数据结构 2023年5月17日
    00
  • Gauss-Seidel迭代算法的Python实现详解

    下面是详细讲解“Gauss-Seidel迭代算法的Python实现详解”的完整攻略,包括算法原理、Python实现和两个示例。 算法原理 Gauss-Seidel迭代法是一种求解线性方程组的方法,其基本思想是通过不断迭代,逐步逼近方程组的解。算的具体步骤如下: 将线性方程组表示为矩阵形式; 对矩阵进行分解,得下三角矩阵L、对角矩阵D和上三角矩阵U; 将方程表…

    python 2023年5月14日
    00
  • Python实现字符串的逆序 C++字符串逆序算法

    以下是关于“Python和C++实现字符串逆序算法”的完整攻略: 简介 字符串逆序是一种常见的字符串操作,它可以将字符串中的字符顺序颠倒过来。Python和C++都提供了多种方法来实现字符串逆序。本教程将介绍如何使用Python和C++实现字符串逆序算法,并提供两个示例说明。 Python实现 1.使用切片 Python中可以使用切片来实现字符串逆序。可以使…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部