队列简介
队列是一种在一端进行插入,而在另一端进行删除的线性表。
- 队列的插入端为队尾,队列删除端为队头。
- 队列的插入操作为入队,删除操作为出队。
队空
rear == front
假满
rear == maxsize && front != 0
真满
rear == maxesize && front == 0
解决假满方法
- 始终让front指向0不改变,当做出队操作时候,将剩余的元素,依次往队头方向移动一个位置,比如排队买车票等案例,比较浪费时间。
- 将队列考虑为首尾相接的环形队列,也叫循环队列
循环队列
实现思路
- 初始化
- 判断队满
front == (this.rear + 1) % maxSize;
- 入队
rear = (rear + 1) % maxSize;//队尾指针加一
- 判断队空
this.front == this.rear;
- 出队
front = (front + 1)% maxSize;//队头指针加一
代码实现
//可以在队列里存储任意元素
public class SqQueue<T> {
//1.队列的成员变量
private T[] datas;//数组模式队列实现
private int maxSize;
private int front;//队头指针
private int rear;//队尾指针
public SqQueue(int maxSize) {
if(maxSize < 1) maxSize = 1;
this.maxSize = maxSize;
this.datas = (T[]) new Object[this.maxSize];//数组匹配
}
//队满方法
public boolean isFull(){
return this.front == (this.rear + 1) % maxSize;
}
//队空方法
public boolean isEmpty(){
return this.front == this.rear;
}
//入队操作
public boolean put(T data){
//队满了无法入队
if(isFull()) return false;
datas[rear] = data;
rear = (rear + 1) % maxSize;//队尾指针加一
return true;
}
/**
* 出队操作
* @return
*/
public T take(){
if(isEmpty()) return null;
T data = datas[front];//出队
front = (front + 1)% maxSize;//队头指针加一
return data;
}
public T[] getDatas() {
return datas;
}
public void setDatas(T[] datas) {
this.datas = datas;
}
public int getMaxSize() {
return maxSize;
}
public void setMaxSize(int maxSize) {
this.maxSize = maxSize;
}
public int getFront() {
return front;
}
public void setFront(int front) {
this.front = front;
}
public int getRear() {
return rear;
}
public void setRear(int rear) {
this.rear = rear;
}
}
- 测试类
public class SqQueueTest {
public static void main(String[] args) {
SqQueue<String> queue = new SqQueue<>(5);
queue.put("诸葛亮");
queue.put("庞统");
queue.put("姜维");
queue.put("关羽");
queue.put("马稷");//循环队列会牺牲一个存储空间
System.out.println("队列 为空:" + queue.isEmpty() + " ,队列是否已满:" + queue.isFull());
while (!queue.isEmpty()){
System.out.print("name:" + queue.take() + " | ");
}
System.out.println();
System.out.println("队列 为空:" + queue.isEmpty() + " ,队列是否已满:" + queue.isFull());
}
}
- 输出结果
队列 为空:false ,队列是否已满:true
name:诸葛亮 | name:庞统 | name:姜维 | name:关羽 |
队列 为空:true ,队列是否已满:false