文章目录
前言
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
一、队列是什么?
队列也是一种线性数据结构
规定:只能从队尾添加元素,从队首取出元素
队列是一种先进先出的数据结构
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列
二、队列的实现
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
入队操作 enqueue:
void enqueue(T ele)
出队操作 dequeue:
T dequeue()
查看队首元素:
T getFront()
队列中实际存放元素的个数:
int getSize()
队列是否为空:
boolean isEmpty()
定义队列的接口
public interface MyQueue<T> {
//入队操作 enqueue
void enqueue(T ele);
//出队操作 dequeue
T dequeue();
//查看队首元素
T getFront();
//队列中实际存放元素的个数
int getSize();
//队列是否为空
boolean isEmpty();
}
以数组作为队列底层数据结构
public class ArrayQueue<T> implements MyQueue<T>{
//数组容器
private MyselfArrays<T> data;
//保存队列中实际存放元素的个数
private int size;
public ArrayQueue() {
this.data = new MyselfArrays<>();
this.size = 0;
}
@Override
public void enqueue(T ele) {
this.data.addTail(ele);
this.size++;
}
@Override
public T dequeue() {
T result = this.data.removeFirst();
if(result != null) {
this.size--;
}
return result;
}
@Override
public T getFront() {
return this.data.getEleByIndex(0);
}
@Override
public int getSize() {
return this.size;
}
@Override
public boolean isEmpty() {
return this.size == 0;
}
public static void main(String[] args) {
int cout = 20;
Random random = new Random();
MyQueue<Integer> queue = new ArrayQueue<>();
for (int i = 0; i < cout; i++) {
int num = random.nextInt(100);
System.out.print(num + ",");
queue.enqueue(num);
if(i>0 && i%3==0){
System.out.println("出队元素:" + queue.dequeue());
}
}
System.out.println("\n-------------------");
while (!queue.isEmpty()){
System.out.print(queue.dequeue() + "--");
}
System.out.println("\n队列是否为空:" + queue.isEmpty());
}
}
三、数组队列问题
dequeue()操作的时间复杂度为O(n),因为在出队时,数组后面的元素要进行前移
循环队列:
为解决前移问题,使用front记录队首位置,使用tail记录队尾位置,这就是循环队列
情况1:
情况2:
情况3:
四、循环队列的复杂度分析
LoopQueue<E>
- void enqueue(E) 0(1) 均摊
- E dequeue() 0(1) 均摊
- E getFront() 0(1)
- int getSize() 0(1)
- boolean isEmpty() 0(1)