3-3 另类循环队列 (20分)【细节】

it2023-07-09  65

3-3 另类循环队列 (20分)

如果用一个循环数组表示队列,并且只设队列头指针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。

裁判测试程序样例:

#include <stdio.h> #include <stdlib.h> #define ERROR -1 typedef int ElementType; typedef enum { addq, delq, end } Operation; typedef enum { false, true } bool; typedef int Position; typedef struct QNode *PtrToQNode; struct QNode { ElementType *Data; /* 存储元素的数组 */ Position Front; /* 队列的头、尾指针 */ int Count; /* 队列中元素个数 */ int MaxSize; /* 队列最大容量 */ }; typedef PtrToQNode Queue; Queue CreateQueue( int MaxSize ) { Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType)); Q->Front = 0; Q->Count = 0; Q->MaxSize = MaxSize; return Q; } bool AddQ( Queue Q, ElementType X ); ElementType DeleteQ( Queue Q ); Operation GetOp(); /* 裁判实现,细节不表 */ int main() { ElementType X; Queue Q; int N, done = 0; scanf("%d", &N); Q = CreateQueue(N); while ( !done ) { switch( GetOp() ) { case addq: scanf("%d", &X); AddQ(Q, X); break; case delq: X = DeleteQ(Q); if ( X!=ERROR ) printf("%d is out\n", X); break; case end: while (Q->Count) printf("%d ", DeleteQ(Q)); done = 1; break; } } return 0; } /* 你的代码将被嵌在这里 */

输入样例:

4 Del Add 5 Add 4 Add 3 Del Del Add 2 Add 1 Add 0 Add 10 End 输出样例: Queue Empty 5 is out 4 is out Queue Full 3 2 1 0

AC代码:

这是一个循环队列,当开始的时候不知道为什么一直不对,后来去找了一下别人的做法,才发现自己错了,以后可要认真读题啊! 有机会再回来做做这个题吧!

bool AddQ( Queue Q, ElementType X ) { if(Q->Count==Q->MaxSize) { printf("Queue Full\n"); return false; } else { Q->Data[(Q->Count+Q->Front)%Q->MaxSize]=X; //这里是循环队列,啊啊,一直是错的 Q->Count++; return true; } } ElementType DeleteQ( Queue Q ) { if(Q->Count==0) { printf("Queue Empty\n"); return ERROR; } else { ElementType x=Q->Data[Q->Front]; Q->Count--; Q->Front=(Q->Front+1)%Q->MaxSize; //注意处理方式 return x; } }
最新回复(0)