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 }