4 【2019统考真题】请设计一个队列,要求满足: 初始时队列为空; ②入队时,允许增加队列占用空间; ③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;④入队操作和出队操作的时间复杂度始终保持为O(1)。请回答下列问题:
1)该队列是应选择链式存储结构,还是应选择顺序存储结构?
2)画出队列的初始状态,并给出判断队空和队满的条件。
3)画出第一个元素入队后的队列状态。
4)给出入队操作和出队操作的基本过程。
我的思路:
刚开始考虑的是 双向链表 队列的队头front是链表的尾指针 队尾是链表的头指针 增设头指针l
开始的时候
typedef struct linkQueue{
int data;
struct linkQueue * next;
struct linkQueue * pre;
}linkQueue;
队空 front==rear
队满 malloc函数或者new 返回false
入队 先判定front->next==null
不是则将front后一个节点 头插 头节点后一节点 (即首元节点前)再rear=rear->pre
是的话就直接新建节点头插
出队 判定rear==front
是 返回false
不是 就e=front->data; front=front->pre;
显然再判断队满的时候有点不严谨
再谈谈王道书的做法
循环链表 先预置一个空节点
初始
入队三次
出队一次
所以
入队时 先判定r->next==f(队满条件),满则建立新节点插入
注意一开始预置的空节点后面也会被使用
出队时 判定r==f (队空条件)