题目链接
习题3.13 双端队列 - 浙大版《数据结构(第2版)》题目集
整体思路
题目要求以顺序方式实现双端队列,在线性表的两端插入和删除。我们使用循环队列存储,其中Push和Inject分别插入队列的头和尾, 因此插入之前必须先判断队列是否为空;Pop和Eject分别是删除队列的头元素和尾元素,因此删除之前必须判断队列是否满了
判断队列为空
Front和Rear相等为空
if (D->Front == D->Rear)
{
ret = ERROR;
}
判断队列满
队列满时,Rear应在Front前一个位置,我们约定此时Rear指向的位置不赋值。但由于是循环队列,应考虑边界情况,不能简单使用D->Front - 1 == D->Rear
if (((D->Front - 1 + D->MaxSize) % D->MaxSize) == D->Rear)
{
ret = false;
}
插入和删除元素同样需要考虑边界情况
代码
bool Push(ElementType X, Deque D)
{
bool ret = true;
if (((D->Front - 1 + D->MaxSize) % D->MaxSize) == D->Rear)
{
// 判断队列满
ret = false;
}
else
{
D->Front = (D->Front - 1 + D->MaxSize) % D->MaxSize;
D->Data[D->Front] = X;
}
return ret;
}
ElementType Pop(Deque D)
{
ElementType ret = 0;
if (D->Front == D->Rear)
{
// 判断队列空
ret = ERROR;
}
else
{
ret = D->Data[D->Front];
D->Front = (D->Front + 1) % D->MaxSize;
}
return ret;
}
bool Inject(ElementType X, Deque D)
{
bool ret = true;
if (((D->Front - 1 + D->MaxSize) % D->MaxSize) == D->Rear)
{
// 判断队列满
ret = false;
}
else
{
D->Data[D->Rear] = X;
D->Rear = (D->Rear + 1) % D->MaxSize;
}
return ret;
}
ElementType Eject(Deque D)
{
ElementType ret = 0;
if (D->Front == D->Rear)
{
// 判断队列空
ret = ERROR;
}
else
{
D->Rear = (D->Rear - 1 + D->MaxSize) % D->MaxSize;
ret = D->Data[D->Rear];
}
return ret;
}