PTA习题3.12 另类循环队列

来源:互联网 发布:钩针设计软件 编辑:程序博客网 时间:2024/05/22 17:25

如果用一个循环数组表示队列,并且只设队列头指针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 -1typedef 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;}/* 你的代码将被嵌在这里 */

输入样例:

4DelAdd 5Add 4Add 3DelDelAdd 2Add 1Add 0Add 10End

输出样例:

Queue Empty5 is out4 is outQueue Full3 2 1 0


bool AddQ( Queue Q, ElementType X )
{
 if(Q->Count>=Q->MaxSize){
   printf("Queue Full\n");
   return false;
 }
 Q->Count++;
 Q->Data[(Q->Front+Q->Count-1)%(Q->MaxSize)]=X; //关键在这一步
 return true;
}


ElementType DeleteQ( Queue Q )
{
  ElementType Data;
  if(Q->Count<=0){
    printf("Queue Empty\n");
    return ERROR;
  }
  Q->Count--;
  Data=Q->Data[Q->Front];
  Q->Front=(Q->Front+1)%(Q->MaxSize);
  return Data;
}

原创粉丝点击