如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
函数接口定义:
bool AddQ( Queue Q, ElementType X );
ElementType DeleteQ( Queue Q );
其中Queue
结构定义如下:
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode {
ElementType *Data; /* 存储元素的数组 */
Position Front; /* 队列的头指针 */
int Count; /* 队列中元素个数 */
int MaxSize; /* 队列最大容量 */
};
typedef PtrToQNode Queue;
注意:如果队列已满,AddQ
函数必须输出“Queue Full”并且返回false
;如果队列是空的,则DeleteQ
函数必须输出“Queue Empty”,并且返回ERROR
。
要注意:
- 基本上找数据位置时都要取余,还要保证取余的是正数。
- 要删除的数据的位置是
Q->Front
,但是在返回要删除的位置前还得把 Front 指针前移,所以要删除的数据应该是Q->Data[(Q->Front-1+Q->MaxSize)%Q->MaxSize]
(注意这里还得加一个Q->MaxSize
,否则Front可能会变成负数,结果还是会出错)。 - 添加数据时,数据的存放位置是
(Q->Front+Q->Count)%Q->MaxSize
。
bool AddQ( Queue Q, ElementType X ){
if(Q->Count==Q->MaxSize){
printf("Queue Full\n");
return false;
}else{
Q->Data[(Q->Front+Q->Count)%Q->MaxSize]=X;
Q->Count++;
return true;
}
}
ElementType DeleteQ( Queue Q ){
if(Q->Count==0){
printf("Queue Empty\n");
return ERROR;
}else{
Q->Count--;
Q->Front=(Q->Front+1)%Q->MaxSize;
return Q->Data[(Q->Front-1+Q->MaxSize)%Q->MaxSize];
}
}