408数据结构2019年第42题代码实战
【题目】请设计一个队列,要求满足: ①初始时队列为空;②入队时,允许增加队列占用空间;③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;④入队操作和出队操作的时间复杂度始终保持为 O(1)。
请回答下列问题:
(1) 该队列是应选择链式存储结构,还是应选择顺序存储结构?
(2) 画出队列的初始状态,并给出判断队空和队满的条件。
(3) 画出第一个元素入队后的队列状态。
(4) 给出入队操作和出队操作的基本过程
代码:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;//指向下一个结点
}LNode,*LinkList;
void en_queue(LinkList front,LinkList &rear,ElemType val)
{
LinkList pnew;
if(rear->next==front)//判断队列是不是满了
{
//队列满,申请一个结点的空间,放入队列
pnew=(LinkList)malloc(sizeof(LNode));
rear->data=val;//把入队元素放入rear指向结点
rear->next=pnew;//放了一个结点,其相当于做了分割
pnew->next=front;
rear=pnew;
}
else
{
//如果队列不满,直接放值,让rear后移一个结点
rear->data=val;
rear=rear->next;
}
}
void de_queue(LinkList &front,LinkList rear)
{
if(front==rear)
{
printf("queue is empty\n");
}
else
{
printf("de_queue value is %d\n",front->data);
front=front->next;
}
}
//循环队列操作的总流程
void circle_queue(LinkList &front,LinkList &rear)
{
//队列头和队列尾都指向一个结点,这时队列即是空的,也是满的
front=(LinkList)malloc(sizeof(LNode));//带头结点的
rear=front;
rear->next=front;//构造循环队列
//入队
en_queue(front,rear,3);
en_queue(front,rear,4);
//出队
de_queue(front,rear);
de_queue(front,rear);
de_queue(front,rear);//此时队列已经空,出队失败
}
int main() {
LinkList front,rear;
circle_queue(front,rear);
return 0;
}
测试结果:
de_queue value is 3
de_queue value is 4
queue is empty
参考答案:
- 参考自王道