习题3.13 双端队列 (25分)
1.题目
双端队列(deque,即double-ended queue的缩写)是一种具有队列和栈性质的数据结构,即可以(也只能)在线性表的两端进行插入和删除。若以顺序存储方式实现双端队列,请编写例程实现下列操作:
Push(X,D):将元素X插入到双端队列D的头;
Pop(D):删除双端队列D的头元素,并返回;
Inject(X,D):将元素X插入到双端队列D的尾部;
Eject(D):删除双端队列D的尾部元素,并返回。
函数接口定义:
bool Push( ElementType X, Deque D );
ElementType Pop( Deque D );
bool Inject( ElementType X, Deque D );
ElementType Eject( Deque D );
2.解题思路及图解
完全可以把双端队列当成循环队列来理解:
相同点:
判空操作:D->Front == D->Rear
判满操作:(D->Rear+1)%D->MaxSize == D->Front
不同点:
循环队列:只能在尾端插入(Rear),头端删除(Front)。.
双端队列:两端都可以进行插入和删除。
3.代码
//双端对列在两端分别进行插入和删除
bool Push( ElementType X, Deque D ){
if( (D->Rear+1)%D->MaxSize==D->Front ){ /*栈满*/
return false;
}
else{
D->Front = (D->Front-1+D->MaxSize)%D->MaxSize; /*确保下标为正*/
D->Data[D->Front] = X;
return true;
}
}
ElementType Pop( Deque D ){
ElementType ret;
if( D->Front==D->Rear){ /*栈空*/
return ERROR;
}
else{
ret = D->Data[D->Front];
D->Front = (D->Front+1)%D->MaxSize;
return ret;
}
}
bool Inject( ElementType X, Deque D ){
if( (D->Rear+1)%D->MaxSize==D->Front ){ /*栈满*/
return false;
}
else{
//Rear总是指向元素的下一位,因为先插入元素,再将Rear移到下一位
D->Data[D->Rear] = X;
D->Rear = (D->Rear+1)%D->MaxSize;
return true;
}
}
ElementType Eject( Deque D ){
if( D->Front==D->Rear){ /*栈空*/
return ERROR;
}
else{
D->Rear = (D->Rear-1+D->MaxSize)%D->MaxSize;
return D->Data[D->Rear];
}
}