Educator错题
实现一个顺序存储的队列
为了操作去思考
#首先,我得定义一个顺序存储的队列
struct SeqQueue {
T* data; // 指向数据元素数组的指针
int front; // 下一个出队元素的数组下标
int rear; // 下一个入队元素应该存放的单元的数组下标
int max; // 队列中最多可放max-1个数据元素,留一个空数据单元以区分空和满
};
在此基础上,我需要定义对于队列的操作,如出队、进队、判断是否为满、是否为空。(这里对于队列的定义和对于操作的定义需不需要放在一个文件里,我还有点迷糊)
SeqQueue* SQ_Create(int maxlen);
void SQ_Free(SeqQueue* sq);
void SQ_MakeEmpty(SeqQueue* sq);
bool SQ_IsEmpty(SeqQueue* sq);
bool SQ_IsFull(SeqQueue* sq);
int SQ_Length(SeqQueue* sq);
bool SQ_In(SeqQueue* sq, T x);
bool SQ_Out(SeqQueue* sq, T& item);
bool SQ_Head(SeqQueue* sq, T& head);
void SQ_Print(SeqQueue* sq)。
//这操作多的我哭了
具体的每个操作如何做
在每个内部进行定义
bool SQ_IsEmpty(SeqQueue* sq)
// 判断队列是否为空,为空返回true,否则返回false。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
/********** End **********/
}
bool SQ_IsFull(SeqQueue* sq)
// 判断队列是否为满。为满返回true,否则返回false。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
/********** End **********/
}
int SQ_Length(SeqQueue* sq)
// 队列长度
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
原:return sq->rear;
对:return (sq->rear-sq->front+sq->max)%sq->max;
/********** End **********/
}
bool SQ_In(SeqQueue* sq, T x)
// 将x入队。若入队失败(队列满),则返回false,否则返回true。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
我的: if(SQ_IsFull(sq))
{
return false;
}
else
{
sq->rear++;
if(sq->rear>sq->max-1)
{sq->rear=0;}
return true; }
/********** End **********/
正确:
if(SQ_IsFull(sq))
{
return false;
}
else
{
T* head=sq->data;
head[sq->rear]=x;
sq->rear=(sq->rear+1)%sq->max;
return true;
}
}
bool SQ_Out(SeqQueue* sq, T& item)
// 从队列sq出队一个元素,返回时item为出队的元素的值。若出队成功(队列不为空),则返回true,否则(队列空),返回false,此时item不会返回有效值。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
我的:
if(SQ_IsEmpty(sq))
{
return false;
}
else
{
sq->front++;
if(sq->front>sq->max-1)
sq->front=0;
return true;
}
正确的:
if(SQ_IsEmpty(sq))
{
return false;
}
else
{
T* head=sq->data;
item=head[sq->front];
sq->front=(sq->front+1)%sq->max;//记得加sq->不要疏忽大意
return true;
}
/********** End **********/
}