题目链接:https://pintia.cn/problem-sets/1101307589335527424/problems/1101313244863737856
题意:实现双段队列的队首出队、入队以及队尾出队、入队4个操作
思路:
根据裁判测试程序我们可以发现,在CreateDeque
函数中将MaxSize加了1,而且这里的MaxSize定义的是最大容量,所以这是一个循环队列,且为了避免Front=Rear时会出现表示队空和队满2种情况的二义性,需要将Rear表示队尾的下一个元素,这样就需要牺牲一个存储单元,所以在CreateDeque
函数中就相应的将MaxSize加了1。知道了这些就可以写出代码了。
AC代码:
1 bool Push( ElementType X, Deque D ){ 2 if((D->Rear+1)%D->MaxSize==D->Front) 3 return false; 4 D->Front=(D->MaxSize+D->Front-1)%D->MaxSize; 5 D->Data[D->Front]=X; 6 return true; 7 } 8 9 ElementType Pop( Deque D ){ 10 if(D->Front==D->Rear) 11 return ERROR; 12 int res=D->Data[D->Front]; 13 D->Front=(D->Front+1)%D->MaxSize; 14 return res; 15 } 16 17 bool Inject( ElementType X, Deque D ){ 18 if((D->Rear+1)%D->MaxSize==D->Front) 19 return false; 20 D->Data[D->Rear]=X; 21 D->Rear=(D->Rear+1)%D->MaxSize; 22 return true; 23 } 24 25 ElementType Eject( Deque D ){ 26 if(D->Front==D->Rear) 27 return ERROR; 28 D->Rear=(D->MaxSize+D->Rear-1)%D->MaxSize; 29 int res=D->Data[D->Rear]; 30 return res; 31 }