前言
队列是一个有序列表,可以用数组或者链表来实现。遵循先入先出原则,即先存入队列的数据,要先取出,后存入的数据后取出。
一、数组实现队列
队列本身是有序列表,如果使用数组的结构来存储队列的数据,那么队列数组要有maxSize(该队列最大容量),队列的输出、输入是分别从前后端来处理的,因此需要两个变量front以及rear分别记录队列前后端的下标,front会随着数据的输出而改变,rear是随着数据输入而改变。
示意图:
二、数组模拟队列代码示例
定义一个自定义表示队列的类
package com.darkForest.queue;
import lombok.extern.slf4j.Slf4j;
/*
* 数组模拟队列,遵循先入先出原则
* */
@Slf4j(topic = "e")
public class MyQueue {
//队列数组
private int[] queueArray;
//最大容量
private int maxSize;
//实际长度
private int length;
//指向队列尾
private int rear;
//指向队列头的前一个位置
private int front;
//构造方法
public MyQueue(int maxSize){
this.maxSize=maxSize;
queueArray=new int[this.maxSize];
rear=-1;
front=-1;
}
//判断是否为空
public boolean isEmpty(){
if (front==rear){
return true;
}
return false;
}
//判断队列是否已满
public boolean isFull(){
if (front==maxSize-1){
return true;
}
return false;
}
//添加方法
public void add(int data){
//先判断队列是否已满
if (isFull()){
throw new RuntimeException("队列已满");
}
front++;
queueArray[front]=data;
length++;
}
//取队列数据
public int get(){
//先判断队列为空
if (isEmpty()){
throw new RuntimeException("队列为空");
}
rear++;
return queueArray[rear];
}
//取全部队列数据
public int[] getAll(){
//判断队列是否为空
if (isEmpty()){
throw new RuntimeException("队列为空");
}
int size=MyQueue.this.length;
int[] takeQueue=new int[size];
for (int i = rear, temp=0; i <=front ; i++,temp++) {
takeQueue[temp]=queueArray[i];
}
return takeQueue;
}
}
来测试一下
package com.darkForest.queue;
import lombok.extern.slf4j.Slf4j;
@Slf4j(topic = "e")
public class Test {
public static void main(String[] args) {
MyQueue myQueue=new MyQueue(5);
myQueue.add(12);
myQueue.add(34);
myQueue.add(21);
int i = myQueue.get();
log.debug("head is {}",i);
int[] all = myQueue.getAll();
for (int j = 0; j < all.length; j++) {
log.debug("queue:{}",all[j]);
}
}
}
测试结果1
异常测试
package com.darkForest.queue;
import lombok.extern.slf4j.Slf4j;
@Slf4j(topic = "e")
public class Test {
public static void main(String[] args) {
MyQueue myQueue=new MyQueue(5);
int i = myQueue.get();
log.debug("head is {}",i);
int[] all = myQueue.getAll();
for (int j = 0; j < all.length; j++) {
log.debug("queue:{}",all[j]);
}
}
}
测试结果2
package com.darkForest.queue;
import lombok.extern.slf4j.Slf4j;
@Slf4j(topic = "e")
public class Test {
public static void main(String[] args) {
MyQueue myQueue=new MyQueue(5);
myQueue.add(1);
myQueue.add(2);
myQueue.add(3);
myQueue.add(4);
myQueue.add(5);
myQueue.add(6);
}
}
测试结果3
总结
队列在许多地方有着相当重要的应用,如多线程中的synchronized等锁要使线程等待,线程就会被放在waitSet中,waitSet就是一个队列。唤醒之后阻塞的线程放在entryList中,entryList也是一个队列。