习题3.12 另类循环队列
习题3.12 另类循环队列分数 20作者 DS课程组单位 浙江大学如果用一个循环数组表示队列并且只设队列头指针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。裁判测试程序样例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; } /* 你的代码将被嵌在这里 */输入样例4DelAdd 5Add 4Add 3DelDelAdd 2Add 1Add 0Add 10End输出样例Queue Empty5 is out4 is outQueue Full3 2 1 0题目代码补齐#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() /* 裁判实现细节不表 */ { char op[10]; scanf(%s, op); if (op[0] A || op[0] a) return addq; else if (op[0] D || op[0] d) return delq; else return end; } 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; } /* 你的代码将被嵌在这里 */答案bool AddQ(Queue Q, ElementType X) { if(Q-CountQ-MaxSize) { printf(Queue Full\n); return false; } //出队后front会变化所以要计算新元素的插入位置 int pos(Q-FrontQ-Count)%(Q-MaxSize); Q-Data[pos]X; Q-Count; return true; } ElementType DeleteQ(Queue Q) { if(Q-Count0) { printf(Queue Empty\n); return ERROR; } ElementType X; XQ-Data[Q-Front]; Q-Front(Q-Front1)%(Q-MaxSize); Q-Count--; return X; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2423461.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!