2019年408算法大题

知识回顾

 

真题

请设计一个队列,满足:

(1)初始时队列为空;(2)入队时,允许增加队列占用空间;

(3)出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;

(4)入队操作和出队操作的时间负责度始终保持为O(1)。

第一问:选链式/顺序存储结构

顺序存储无法满足(2)的“队列占用空间随着入队而增加”,(1)容易满足;

链式存储方便开辟新空间,要求(2)容易满足;

要求(3)出队后的结点并不真正释放,用队头指针指向新的队头结点,新元素入队时,有空余结点则无须开辟新空间,赋值到队尾后的第一个空结点即可,然后用队尾指针指向新的队尾结点,即设计成一个首尾相接的循环单链表(类似循环队列)。设置队头、队尾指针后,链式队列的入队和出队操作的时间负责度均为O(1)。

因此链式存储结构(两段式单向循环链表),队头指针为front,队尾指针为rear。

第二问:画队列初始状态,判断队空和队满的条件

循环链式队列的实现可以参考循环队列,

不同之处在于循环链式队列可以方便增加空间,出队的结点可以循环利用,入队时空间不够也能动态增加。

循环链式队列也要区分队满和队空情况,此处参考循环队列牺牲一个单元来判断。

初始时,创建只有一个空闲结点的循环单链表,头指针front和尾指针rear均指向空闲结点。

队空的判定条件:front==rear。

队满的判定条件:front==rear->next

2019年408算法大题_第1张图片

第三问:画第一个元素入队后的队列状态

第四问:入队&出队基本过程

 

你可能感兴趣的:(基础算法)