持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
前言
昨天总结了栈的相关知识,今天来继续总结队列。
定义
队列是只允许在表的一端进行插入,另一端进行删除。
由上图可以看出,允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
特点
队列的最主要特点是先入先出,这与栈有很多不同。
队列的表示与实现
队列顺序表示和实现——顺序队列
用一组地址连续的存储单元依次存放从队头到队尾的元素, 设指针front和rear分别指示队头元素和队尾元素的位置。
队空条件:front=rear 入队EnQueue(Q,e):Q[rear]=e; rear++; 出队DeQueue(Q,e) : e=Q[front]; front++;
队列的链式表示和实现——链队列
入队EnQueue(Q,e): rear->next=S; rear=S; 出队DeQueue(Q,e): p=front->next; front->next=p->next; free(p);
注意:在不支持自动垃圾回收的语言要手动释放内存。
循环队列
在顺序队列中,当尾指针已到达数组的上界,不能再进行入队操作,但实际上数组中还有空位置,这种情况叫做假溢出。为了解决这种情况,有了循环队列(将存放队列元素的数组首尾相接)
队满条件: front=(rear+1)%N
插入元素时,队尾指针:rear=(rear+1)%N
删除元素时,队头指针: front=(front +1)%N
经典问题
经过这几天的刷题,来总结一些队列的经典问题:
滑动窗口最大值
这道题需要判断一些情况,实现单调队列
求前K个高频元素
这道题带我们认识了优先队列,并让我们了解了堆的概念
总结
对于队列我还是有些不太熟悉,还需要练习一下。