需求:用数组实现环形队列
代码实现:
/**
* @ClassName: CircleQueue
* @Description:
* @Author: xuezhouyi
* @Version: V1.0
**/
public class CircleQueue {
private static class Test {
public static void main(String[] args) {
CircleQueue cq = new CircleQueue(4);
cq.offer(1);
cq.show();
cq.offer(3);
cq.show();
cq.offer(5);
cq.show();
cq.offer(7);
cq.show();
cq.poll();
cq.show();
cq.offer(7);
cq.show();
cq.offer(9);
cq.show();
cq.poll();
cq.show();
cq.poll();
cq.show();
cq.poll();
cq.show();
cq.poll();
cq.offer(9);
cq.show();
cq.poll();
cq.show();
cq.offer(9);
cq.show();
cq.offer(8);
cq.show();
/* 输出:
成功加入元素:1
0<=>1
成功加入元素:3
0<=>1
1<=>3
成功加入元素:5
0<=>1
1<=>3
2<=>5
队列已满,无法加入!
0<=>1
1<=>3
2<=>5
取出一个元素:1
1<=>3
2<=>5
成功加入元素:7
1<=>3
2<=>5
3<=>7
队列已满,无法加入!
1<=>3
2<=>5
3<=>7
取出一个元素:3
2<=>5
3<=>7
取出一个元素:5
3<=>7
取出一个元素:7
<空>
没有元素
成功加入元素:9
0<=>9
取出一个元素:9
<空>
成功加入元素:9
1<=>9
成功加入元素:8
1<=>9
2<=>8
* */
}
}
private int[] circleArr;
private int front;
private int end;
public CircleQueue(int size) {
circleArr = new int[size];
}
/* 分析如何计算索引加一:
因为是循环数组,所以当索引指向最后一个位置时需要考虑如何回到初始索引位置
可以通过简单的取余算法来实现
* */
private int next(int index) {
return (index + 1) % circleArr.length;
}
/* 分析如何计算元素个数:
如果end大于front则end减front
如果end小于front则end加长度-front
if (end < front)
return end + circleArr.length - front;
return end - front;
或者如下
* */
private int size() {
return (end + circleArr.length - front) % circleArr.length;
}
/* 分析如何遍历数组:
front索引一直加一直到和end索引重合则遍历结束,这就需要使用next()函数
* */
public void show() {
if (size() == 0)
System.out.println("<空>");
/* 从front位置开始遍历到front加count结束 */
for (int i = front; i < front + size(); i++) {
/* 取出元素需要注意对长度取余 */
System.out.println(i + "<=>" + circleArr[i % circleArr.length]);
}
}
/* 添加元素到队列 */
public void offer(int e) {
if (isFull()) {
System.out.println("队列已满,无法加入!");
} else {
circleArr[end] = e;
end = next(end);
System.out.println("成功加入元素:" + e);
}
}
/* 分析数组是否还可以存:
如果end和front一样的话就存在一个问题,当end一直存存存到满之后再加一会和front的值一样,
这样就没法确定这个数组是空的还是满的,所以是需要将end后移一位,也就是始终保证数组留有一个空位
* */
private boolean isFull() {
return front == next(end);
}
/* 取出元素 */
public void poll() {
if (isEmpty()) {
System.out.println("没有元素");
} else {
System.out.println("取出一个元素:" + circleArr[front]);
front = next(front);
}
}
/* 检查数组是否还可以取 */
private boolean isEmpty() {
return front == end;
}
}