队列:是一个有序列表,可以用数组或者链表实现,遵循先入先出(first in first out)FIFO原则。
用数组实现如下:
public class ArrayQueue {
private int maxSize;//数组的最大容量
private int front;//队列头的前一个位置
private int rear;//队列尾
private int[] arr;
//构造队列
public ArrayQueue(int arrMaxSize){
maxSize=arrMaxSize;
arr=new int[maxSize];
front=-1;//队列头的前一个位置
rear=-1;
}
//判断队列是否满
public boolean isFull(){
return rear==maxSize-1;
}
//判断队列是否空
public boolean isEmpty(){
return rear==front;
}
//添加数据到队列
public void addQueue(int value){
if(isFull()){
System.out.println("队列满!");
return;
}
rear++;
arr[rear]=value;
}
//数据出队列
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空,没有数据!");
}
front++;
return arr[front];
}
//遍历数据并显示
public void showQueue(){
if(isEmpty()){
System.out.println("队列空,没有数据显示!");
return;
}
for (int i = front+1; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//显示队列的头数据
public int showHead(){
if(isEmpty()){
throw new RuntimeException("没有数据,头为空!");
}
return arr[front+1];
}
}
测试类
public class ArrayQueueDemo {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(4);
queue.addQueue(2);
queue.addQueue(4);
queue.addQueue(5);
queue.addQueue(6);
//queue.addQueue(4);
queue.showQueue();//2,4,5,6
System.out.println("----------------");
int res = queue.getQueue();
System.out.println(res);//2
System.out.println("----------------");
int res2 = queue.showHead();
System.out.println(res2);
System.out.println("----------------");
queue.addQueue(8);
queue.showQueue();//4,5,6
}
}
从结果可以看出,这种方法有bug,插入了2,4,5,6四个数据,然后出队列,队列只剩下4,5,6三个数据,但是再添加一个8,却显示队列满!这是因为虽然2出了队列,它在数组中的内存却没有释放,只是用front指针模拟了队列而已。因此,可以用环形数组来解决这个问题。
用数组模拟环形队列:
public class CircleQueue {
private int maxSize;//数组的最大容量
private int front;//队列头
private int rear;//队列尾的后一个位置
private int[] arr;
//构造队列
public CircleQueue(int arrMaxSize){
maxSize=arrMaxSize;
arr=new int[maxSize];
}
//判断队列是否满
public boolean isFull(){
return (rear+1)%maxSize==front;
}
//判断队列是否空
public boolean isEmpty(){
return rear==front;
}
//添加数据到队列
public void addQueue(int value){
if(isFull()){
System.out.println("队列满!");
return;
}
arr[rear]=value;
rear=(rear+1)%maxSize;
}
//数据出队列
public int getQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空,没有数据!");
}
int value=arr[front];
front=(front+1)%maxSize;
return value;
}
//遍历队列数据并显示
public void showQueue(){
if(isEmpty()){
System.out.println("队列空,没有数据显示!");
return;
}
for (int i = front; i < front+size(); i++) {
System.out.println(arr[i%maxSize]);
}
}
//求当前队列的有效数据个数
public int size(){
return (rear+maxSize-front)%maxSize;
}
//显示队列的头数据
public int showHead(){
if(isEmpty()){
throw new RuntimeException("没有数据,头为空!");
}
return arr[front];
}
}
测试类
public class CircleQueueDemo {
public static void main(String[] args) {
CircleQueue queue = new CircleQueue(4);
queue.addQueue(2);
queue.addQueue(4);
queue.addQueue(5);
queue.showQueue();//2,4,5
System.out.println("----------------");
int res = queue.getQueue();
System.out.println(res);//2
System.out.println("----------------");
int res2 = queue.showHead();
System.out.println(res2);
System.out.println("----------------");
queue.addQueue(8);
queue.showQueue();//4,5,8
}
}
最大容量为4,实际只能存3个数据,预留一个空间,用来判断是否满!当然,也有不预留空间的办法。此外,还有用链表实现的方法。最重要的是思想!