任务描述
本关任务:编写一个单链表循环队列,实现入队、出队操作,判断队空等特殊情况。
相关知识
为了完成本关任务,你需要掌握:1.单链表循环队列定义,2.入队、出队的定义,3.队空的情况。
单链表循环队列
单链表循环队列设一个尾指针rear
,不设头指针。队尾添加数据的时候,只需要在rear
和rear->next
之间插入该数据节点,然后将rear
指向这个节点。因为没有头指针,所以添加一个整形变量size_
来判定队列空的情况。
struct Node // 数据节点
{
int data; // 数据类型
Node *next; // 指向下一个节点的指针
};
struct CycleQueue // 循环链表队列
{
int size_; // 目前队列元素个数
Node *rear; // 尾指针
};
入队出队定义
注意初始队列时,尾指针rear = NULL
以及rear->next = NULL
。
入队操作:
- 为待入队元素创建数据节点
Node* node
; - 如果队列为空,则尾节点指向新节点
rear = node
,rear->next
指向队首节点rear->next = node
。 - 如果队列非空,则在
rear
和rear->next
之间插入新节点:Node *temp = rear->next;
rear->next = node;
node->next = temp;
rear = node;
rear->next = temp;
出队操作:队列不空,返回队首元素值。
- 第一步:获取队首节点
Node *node = rear->next
; - 第二步:移除队首节点,修改
rear->next = node->next
。
队空情况
队列中不含数据节点,通过变量size_
来判定队列空的情况。
编程要求
本关的编程任务是补全右侧代码片段isEmpty
、enQueue
和deQueue
中Begin
至End
中间的代码,具体要求如下:
- 在
isEmpty
中,判断队列是否为空,若空返回true
并在一行打印The queue is Empty
,否则返回false
; - 在
enQueue
中,实现入队操作:将元素item
加入队列尾部; - 在
deQueue
中,实现出队操作:移除队列首部元素,并返回元素值。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入: 7
enqueue
30
enqueue
98
dequeue
enqueue
96
dequeue
dequeue
enqueue
0
预期输出: 0 The queue is Empty
输入说明: 第一行m
分别表示链队列入队出队操作记录数量。 接下来m
行,enqueue
表示入队操作,后面接待入队元素;dequeue
表示出队操作。
输出说明: 输出m
个操作之后的所有队列元素。
//
// queue_.cpp
// Cycle
//
// Created by ljpc on 2018/5/30.
// Copyright © 2018年 ljpc. All rights reserved.
//
#include "queue_.h"
void creatCycleQueue(CycleQueue* que)
// 创建一个循环队列指针que
{
que->size_ = 0;
que->rear = NULL;
}
bool isEmpty(CycleQueue* que)
// 判断队列que是否为空
// 若空返回 true 并在一行打印 The queue is Empty 末尾换行!!!
// 否则返回 false
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(que->rear==NULL)
{
printf("The queue is Empty\n");
return true;
}
else
return false;
/********** End **********/
}
void enQueue(CycleQueue* que, int item)
// 实现入队操作:将元素item加入队列que尾部
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
struct Node* p=(Node*)malloc(sizeof(Node));
p->data=item;
if(que->rear==NULL)
{
p->next=p;
que->rear=p;
que->size_+=1;
}
else
{
p->next=que->rear->next;
que->rear->next=p;
que->rear=p;
que->size_+=1;
}
/********** End **********/
}
int deQueue(CycleQueue* que)
// 实现出队操作:移除队列que首部元素,并返回元素值
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
Node* t;
int e;
if(que->rear->next==que->rear)
{
e=que->rear->data;
que->size_-=1;
free(que->rear);
que->rear=NULL;
}
else{
t=que->rear->next;
e=t->data;
que->rear->next=t->next;
que->size_-=1;
free(t);
}
return e;
/********** End **********/
}
void printQueue(CycleQueue* que)
// 打印队列
{
while (isEmpty(que)==false) {
int item = deQueue(que);
printf("%d ", item);
}
}