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

  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日

相关文章

  • Go 数据结构之二叉树详情

    Go 数据结构之二叉树详情 二叉树是一种树形数据结构,它的每个节点至多只有两个子节点,通常称为左子节点和右子节点。在本文中,我们将介绍二叉树的定义、遍历方法和常见应用场景。 定义 一个二叉树是一个有根树,它的每个节点最多有两个子节点,用左子树和右子树来区分。 在 Go 代码中,可以通过如下结构体定义表示二叉树的节点: type Node struct { L…

    数据结构 2023年5月17日
    00
  • Python查找算法之插补查找算法的实现

    Python查找算法之插补查找算法的实现 插补查找算法是一种高效的查找算法,它是在二分查找算法的基础上进行改进的。插补查算法的基本思想是根据查找值在查找表中的位置进行插值计算,从而确定下一次查找的位置。本文将详细讲解Python查找算法之插补查找算法的实现,包括算法原理、Python实现过程和示例。 算法原理 插补查找算法是一基于二分查找法的改进算法,它的基…

    python 2023年5月13日
    00
  • 一文教你用python编写Dijkstra算法进行机器人路径规划

    一文教你用Python编写Dijkstra算法进行机器人路径规划 Dijkstra算法是一种用于寻找图中最短路径的算法,它的基本思想是从起点开始逐步扩展到离起点越来越远的节点,直到到达终点为止。在这个过程中,我们维护一个距,用于记录每个节点到起点的距离,以及一个前驱数组用于记录每个节点的前驱节点。在算法结束后,可以通过前驱数组来重构最短路径。 在本文中,我们…

    python 2023年5月14日
    00
  • 使用python实现kmean算法

    K均值聚类算法是一种常用的无监督学习算法,它可以将数据集分成K个簇,每个簇包含最接近其质心的数据点。在本文中,我们将介绍如何使用Python实现K均值聚类算法。 步骤1:导入必要的库 在实现K均值聚类算法之前,我们需要导入必要的库。在这个例子中,我们将使用numpy和matplotlib库。numpy库用于处理数值计算,matplotlib库用于绘制图表。我…

    python 2023年5月14日
    00
  • python数据结构之二叉树的遍历实例

    以下是关于“Python数据结构之二叉树的遍历实例”的完整攻略: 简介 二叉树是一种常见的数据结构,它由节点和边组成,每个节点最多有两个子节点。在本教程中,我们将介绍如何使用Python实现二叉树的遍历,并提供一些示例说明。 二叉树的遍历 二叉树的遍历是指按照一定的顺序访问二叉树中的所有节点。常见的二叉树遍历方式有三种:前序遍历、中序遍历和后序遍历。前序遍历…

    python 2023年5月14日
    00
  • Python数据结构与算法之跳表详解

    Python数据结构与算法之跳表详解 跳表是一种基于链表的数据结构,它可以快速地查找、插入和删除元素。跳的时间复杂度为O(log n),与平衡树相当,但实现起来比平衡树简单。本文将介绍跳表的本原理、实现方法和应用场景。 1. 基本原理 跳表是一种基于链表的数据结构,它通过在链表中添加多级索引来加速查找。每个索引层都是原始链表的一个子集,其中每个节点都具指向下…

    python 2023年5月14日
    00
  • Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)

    Python实现常见的几种加密算法 在计算机安全领域,加密算法是非常重要的一部分。加密算法可以保护数据的机密性完整性和可用性。在本文中,我们将介绍常见的种加密算法,包括MD5,SHA-1,HMAC,DES/AES,RSA和ECC,并提供Python实现的完整攻略。 MD5 MD5是一种常见的哈希函数,它可以将意长度的消息转换为一个128位的哈希值。MD5算法…

    python 2023年5月13日
    00
  • MySQL底层数据结构选用B+树的原因

    MySQL底层数据结构选用B+树的原因主要是因为B+树具有以下优点: 能够快速查找B+树的查找速度非常快,时间复杂度为O(log n),在海量数据的环境中,能够快速定位目标数据。因为B+树每次查找只需要遍历树高度的次数,即使数据量很大,树的高度也很小。 能够高效地进行增删改操作B+树的平衡性能够保证树的高度非常小,大部分操作只需要遍历树的高度,而不是整颗树,…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部