为了完成本关任务,你需要掌握:1.循环队列定义,2.入队、出队的定义,3.队空、队满的情况。
循环队列定义
循环队列将数组存储区看成是一个首尾相接的环形区域(下图)。当数据存放到尾地址后,下一个地址就跳转到首地址。循环队列定义如下:
struct Queue{
int maxSize; // 队列最大长度
int *data; // 数据指针
int front; // 头指针索引
int rear; // 尾指针索引
};
入队出队定义
入队操作:队列未满,在队尾插入一个元素item
,使得data[rear+1]=item
,若超过存储空间则尾指针索引取模(rear+1)%maxSize
;
出队操作:队列不空,返回队首元素值data[front]
,并移除队首元素front+1
,若超过存储空间则头指针索引取模(front+1)%maxSize
。
队空队满情况
初始化创建空队时,令front=rear=0
, 其中front
指向队首元素,rear
指向队尾元素的下一个元素:
- 当队空时:
front==rear
- 当队满时:
front==rear
亦成立
因此只凭等式front==rear
无法判断队空还是队满。 一个方法是少用一个元素空间,约定:队列头指针front
在队尾指针rear
的下一个位置上作为队列“满”状态的标志(如上图),即:
- 队空时:
front==rear
- 队满时:
(rear+1)%maxSize==front
编程要求
本关的编程任务是补全右侧代码片段isFull
、isEmpty
、enQueue
和deQueue
中Begin
至End
中间的代码,具体要求如下:
- 在
isFull
中,判断队列是否为满,若满返回true
并在一行打印The queue is Full
,否则返回false
; - 在
isEmpty
中,判断队列是否为空,若空返回true
并在一行打印The queue is Empty
,否则返回false
; - 在
enQueue
中,实现入队操作:将元素item
加入队列尾部; - 在
deQueue
中,实现出队操作:移除队列首部元素,并返回元素值。
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是平台的测试样例:
测试输入: 10
7
enqueue
30
enqueue
98
dequeue
enqueue
96
dequeue
dequeue
enqueue
0
预期输出: 0 The queue is Empty
输入说明: 第一行n
m
分别表示循环队列大小、入队出队操作记录数量。 接下来m
行,enqueue
表示入队操作,后面接待入队元素;dequeue
表示出队操作。
输出说明: 输出m
个操作之后的所有队列元素。
#include "queue_.h"
using namespace std;
void creatQueue(Queue* que, int maxSize)
// 创建一个循环队列指针que,队列最大长度为maxSize
{
que->maxSize = maxSize;
que->data = (int*)malloc(maxSize * sizeof(int));
que->front = que->rear = 0;
}
void destroyQueue(Queue* que)
// 释放队列内存空间
{
free(que->data);
}
bool isFull(Queue* que)
// 判断队列que是否为满
// 若满返回 true 并在一行打印 The queue is Full 末尾换行!!!
// 否则返回 false
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if((que->rear+1)%que->maxSize==que->front)
{
cout<<"The queue is Full"<<endl;
return true;
}
else
return false;
/********** End **********/
}
bool isEmpty(Queue* que)
// 判断队列que是否为空
// 若空返回 true 并在一行打印 The queue is Empty 末尾换行!!!
// 否则返回 false
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(que->front==que->rear)
{
cout<<"The queue is Empty"<<endl;
return true;
}
else
return false;
/********** End **********/
}
int enQueue(Queue* que, int item)
// 实现入队操作:将元素item加入队列que尾部
// 若队列没满,编写加入操作,返回 1
// 若队列满了,不做任何操作,返回 -1
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(isFull(que)) return -1;
que->data[que->rear]=item;
que->rear=(que->rear+1)%que->maxSize;
return 1;
/********** End **********/
}
int deQueue(Queue* que)
// 实现出队操作:移除队列que首部元素,并返回元素值
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int item=que->data[que->front];
que->front=(que->front+1)%que->maxSize;
return item;
/********** End **********/
}
void printQueue(Queue* que)
// 打印队列
{
while (isEmpty(que)==false) {
int item = deQueue(que);
printf("%d ", item);
}
}