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