1 为了使begin和end解耦,不产生关联,更好的实现队列功能,添加一个变量size。增加一个属性size用来记录目前的元素个数。目的是当begin=end的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满。2、数组中只存储数组大小-1个元素,保证rear转一圈之后不会和head相等,也就是队列满的时候,rear+1=head,中间刚好空一个元素。 当rear=head的时候,一定是队列空了。
第一种方式代码实现:
public static class MyQueue {
private int[] arr;
private int pushi;// end 进来的数放在那里
private int polli;// begin 弹出的出从哪里拿
private int size;//使得begin 和 end解耦 size相当的重要
private final int limit;
public MyQueue(int limit) {
arr = new int[limit];
pushi = 0;
polli = 0;
size = 0;
this.limit = limit;
}
public void push(int value) {
if (size == limit) {
throw new RuntimeException("队列满了,不能再加了");
}
size++;
arr[pushi] = value;
pushi = nextIndex(pushi);
}
public int pop() {
if (size == 0) {
throw new RuntimeException("队列空了,不能再拿了");
}
size--;//如果能拿数的情况下
int ans = arr[polli];
polli = nextIndex(polli);
return ans;
}
public boolean isEmpty() {
return size == 0;
}
// 如果现在的下标是i,返回下一个位置
private int nextIndex(int i) {
return i < limit - 1 ? i + 1 : 0;
}
}