PTA双端队列-方法一

1. /*注意:
1.双端队列也是循环队列
2.本题中题干默认尾指针指向队列中最后一个元素的下一位
方法一:
求解此类题目要么将头指针指向队列的第一个元素的前一位,尾指针指向最后一个元素
方法二:
要么将头指针指向队列的第一个元素,尾指针指向最后一个元素的后一位

大忌:
同时让一个指向第一,一个指向最后一个
*/
bool Push( ElementType X, Deque D ){//将元素X插入到双端队列D的头;Push应该在正常执行完操作后返回true,或者在出现非正常情况时返回false。
    if((D->Rear+1)%D->MaxSize==D->Front) return false;
    else{//头指针指向队列里的第一个元素
        D->Front=(D->Front-1+D->MaxSize)%D->MaxSize;//找出当前头指针的前一位
        //如果头指针恰好指向第一个位置,那么它的数组下标应为0,减去一变为负数,实际,它的前一位应该变为数组的最后一个元素
        //所以,应该加上D->MaxSize,再对此求余
        D->Data[D->Front]=X;
        return true;
    }
}
ElementType Pop( Deque D ){//删除双端队列D的头元素,并返回;当Front和Rear相等时队列为空,Pop必须返回由裁判程序定义的ERROR。
    if(D->Front==D->Rear) return ERROR;
    else {
        Position t=D->Front;//找出当前头指针的下一位
        D->Front=(D->Front+1)%D->MaxSize;//以极限为例验证队头指针求解的正确性,
        //如果头指针恰好指向最后一个位置,那么它的数组下标应为D->Maxsize-1,加上一正好赶上数组最大值,对此求余,正好变为第一个位置
        return D->Data[t];
    }
}
bool Inject( ElementType X, Deque D ){//将元素X插入到双端队列D的尾部;Inject在正常执行完操作后返回true,或者在出现非正常情况时返回false。||!D->Data[++D->Rear]
    if((D->Rear+1)%D->MaxSize==D->Front) return false;
    else{//尾指针指向队列里最后一个元素的下一位
        D->Data[D->Rear]=X;
        D->Rear=(D->Rear+1)%D->MaxSize;//最后一个元素的下一位 需要往后移动一位
        return true;
    }
}
ElementType Eject( Deque D ){//删除双端队列D的尾部元素,并返回。当Front和Rear相等时队列为空,Eject必须返回由裁判程序定义的ERROR。
    if(D->Front==D->Rear) return ERROR;
    else {
        D->Rear=(D->Rear-1+D->MaxSize)%D->MaxSize;//找出当前尾指针的前一位
        //因为尾指针指向队列里最后一个元素的下一位,所以尾指针往前移动一位指向的才是最后一个元素
        return D->Data[D->Rear];
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务