用java实现循环队列的方法:
1、增加一个属性size用来记录目前的元素个数。目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满。
2、数组中只存储数组大小-1个元素,保证rear转一圈之后不会和head相等,也就是队列满的时候,rear+1=head,中间刚好空一个元素。
当rear=head的时候,一定是队列空了。
下面代码使用第一种方法实现。 你可以尝试写出第二种实现。
public class ArrayQueue {
private int[] arr = new int[5];
private int size = 0;
private int head = 0;
private int tail = 0;
public static void main(String[] args) {
/*
* 0 bipush 10
2 istore_1
3 iload_1
4 iinc 1 by 1
7 istore_1
*
int tail = 10;
tail = tail++;
*
*
*
* 0 bipush 10
2 istore_1
3 iinc 1 by 1
6 getstatic #5 <java/lang/System.out>
9 iload_1
* int tail = 10;
tail++;
System.out.println(tail);
* */
ArrayQueue arrayQueue = new ArrayQueue();
arrayQueue.add(1);
arrayQueue.add(2);
arrayQueue.add(3);
System.out.println(arrayQueue.poll());
System.out.println(arrayQueue.poll());
System.out.println(arrayQueue.poll());
arrayQueue.add(4);
arrayQueue.add(5);
arrayQueue.add(6);
arrayQueue.add(7);
arrayQueue.add(8);
System.out.println(arrayQueue.poll());
System.out.println(arrayQueue.poll());
System.out.println(arrayQueue.poll());
System.out.println(arrayQueue.poll());
System.out.println(arrayQueue.poll());
System.out.println(arrayQueue.head +" "+arrayQueue.tail);
//System.out.println(arrayQueue.poll());
}
public void add(int value){
if(tail == head && size == arr.length){
System.out.println("队列已经满");
return;
}
arr[tail++] = value;
tail = tail%arr.length;
size ++;
}
public int poll(){
if(head == tail && size == 0){
System.out.println("队列已经空");
return -1;
}
int ret = arr[head++];
head = head%arr.length;
size--;
return ret;
}
}