【数据结构】双端队列

23 阅读1分钟

题目链接

习题3.13 双端队列 - 浙大版《数据结构(第2版)》题目集

整体思路

题目要求以顺序方式实现双端队列,在线性表的两端插入和删除。我们使用循环队列存储,其中PushInject分别插入队列的头和尾, 因此插入之前必须先判断队列是否为空;PopEject分别是删除队列的头元素和尾元素,因此删除之前必须判断队列是否满了

判断队列为空

FrontRear相等为空

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;
}