1.什么是队列
- 队列是一种比较特殊的线性表,特殊就在于它只允许在表的前端来进行删除,在表的后端来进行插入,队列它是一种操作受限制的线性表。插入的一端称为队尾,删除的一端称为队头,队列里没有元素就称它为空队列。
- 队列是一个有序列表,可以用数组或者是链表来实现的。遵循的是先入先出的原则,就是先存入队列的数据要先取出,后面存的需要后面取出。
-
顺序队列
- 顺序队列通常是采用了一维数组存储队列里的元素,另外是增加两个指针分别是指向了数组里的队首元素和队尾的元素。其中对头的指针称为front,队尾的称为rear。
-
链式队列
-
链式队列就是采用单链表作为存储表示,因此话可以在链式队列的声明里用单链表来定义它的存储空间。
-
链式队列的队头指针指向单链表的第一个结点,队尾指针指向单链表的最后一个结点。
-
链式队列的队头元素存放在单链表的第一个结点内,若要从队列中退出一个元素,必须从单链表中删去第一个结点,而存放着新元素的结点应插在队列的队尾,即单链表的最后一个结点后面,这个新节点将成为新的队尾
-
2.顺序队列的功能实现
初始化队列 | public ListQueue(int maxSize) |
---|---|
判断队列是否为空 | public boolean isEmpty() |
判断队满 | public boolean isFull() |
添加元素到队列中 | public void add(T data) |
出队列 并返回出队列的元素 | public T get() |
遍历队列 | public void show() |
(1)初始化队列大小
(2)判断队列是否已满
(3)判断队列是否为空
(4)遍历队列中所有元素
(5)入队操作
(6)出队操作
3.顺序队列功能测试
(1)整体代码实现
/**
* @description 顺序队列 底层采用数组实现的队列
* @author lixiang
* @version v1.0
*/
public class ListQueue<T> {
/**
* 定义队列的最大长度
*/
private int maxSize;
/**
* 队头指针
*/
private int front;
/**
* 队尾指针
*/
private int rear;
/**
* 当前数组的长度
*/
private int size;
/**
* 定义数组
*/
private final T[] queue;
/**
* 定义默认的队列大小
*/
private final static int DEFAULT_QUEUE_SIZE = 10;
/**
* 初始化队列
* 指定队列大小
* @param maxSize
*/
public ListQueue(int maxSize){
this.maxSize = maxSize;
this.front = 0;
this.size = 0;
this.rear = 0;
queue = (T[]) new Object[maxSize];
}
/**
* 初始化队列
* 不指定队列大小,默认10
* @param maxSize
*/
public ListQueue(){
this.maxSize = DEFAULT_QUEUE_SIZE;
this.front = 0;
this.size = 0;
this.rear = 0;
queue = (T[]) new Object[DEFAULT_QUEUE_SIZE];
}
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty(){
return front == rear;
}
/**
* 判断队列是否已满
* @return
*/
public boolean isFull(){
return rear == maxSize;
}
/**
* 获取当前有效元素个数
* @return
*/
public int getSize(){
return size;
}
/**
* 元素入队操作
* @param data
*/
public void add(T data){
if (isFull()){
throw new RuntimeException("当前队列已将满了");
}
//将当前的队尾指向新的数据
queue[rear] = data;
//队尾++
rear++;
//有效元素个数++
size++;
}
/**
* 元素出队操作
* @return
*/
public T get(){
if (isEmpty()){
throw new RuntimeException("当前队列为空");
}
//队列先进先出,弹出队列头部的数据
T data = queue[front];
//队头++
front++;
//有效元素个数--
size--;
return data;
}
/**
* 展示所有元素
*/
public void show(){
if (isEmpty()){
System.out.println("[]");
return;
}
for (int i = front; i < rear; i++) {
System.out.print(queue[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
ListQueue<Integer> listQueue = new ListQueue<>(5);
System.out.println("判断当前队列是否为空:"+listQueue.isEmpty());
System.out.println("判断当前队列是否已满:"+listQueue.isFull());
System.out.println("向队列中加入元素:1 2 3");
listQueue.add(1);
listQueue.add(2);
listQueue.add(3);
System.out.println("输出队列中的元素:");
listQueue.show();
System.out.println("队列弹出元素:"+listQueue.get());
System.out.println("输出队列中的元素:");
listQueue.show();
System.out.println("当前有效元素个数:"+ listQueue.getSize());
}
}
(2)测试结果