队列

94 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

前言

昨天总结了栈的相关知识,今天来继续总结队列。

定义

队列是只允许在表的一端进行插入,另一端进行删除。

image.png

由上图可以看出,允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。

特点

队列的最主要特点是先入先出,这与栈有很多不同。

队列的表示与实现

队列顺序表示和实现——顺序队列

用一组地址连续的存储单元依次存放从队头到队尾的元素, 设指针front和rear分别指示队头元素和队尾元素的位置。

image.png

队空条件:front=rear 入队EnQueue(Q,e):Q[rear]=e; rear++; 出队DeQueue(Q,e) : e=Q[front]; front++;

队列的链式表示和实现——链队列

image.png

入队EnQueue(Q,e): rear->next=S; rear=S; 出队DeQueue(Q,e): p=front->next; front->next=p->next; free(p);

注意:在不支持自动垃圾回收的语言要手动释放内存。

循环队列

在顺序队列中,当尾指针已到达数组的上界,不能再进行入队操作,但实际上数组中还有空位置,这种情况叫做假溢出。为了解决这种情况,有了循环队列(将存放队列元素的数组首尾相接)

image.png

队满条件: front=(rear+1)%N

插入元素时,队尾指针:rear=(rear+1)%N

删除元素时,队头指针: front=(front +1)%N

经典问题

经过这几天的刷题,来总结一些队列的经典问题:

滑动窗口最大值

这道题需要判断一些情况,实现单调队列

求前K个高频元素

这道题带我们认识了优先队列,并让我们了解了堆的概念

总结

对于队列我还是有些不太熟悉,还需要练习一下。