循环队列实现

时间:2013-12-16 19:29:01

标签: c queue

以下循环队列实现来自数据结构书。

struct circqueue {
   int front,rear;
   int capacity;
   int *array;
};




struct circqueue *q(int size) {
   struct circqueue *q=malloc(sizeof(struct circqueue));
   if(!q)return NULL;
   q->capacity=size;
   q->front=-1;
   q->rear=-1;
   q->array=malloc(q->capacity*sizeof(int));
   if(!q->array)return NULL;
  return q;
}

int isemptyqueue(struct circqueue *q) {
   return(q->front==-1);
}

int isfullqueue(struct circqueue *q) {
   return((q->rear+1)%q->capacity==q->rear);
}

int queuesize(struct circqueue *q) {
   return(q->capacity-q->rear+q->front+1)%q->capacity;
}


void enqueue(struct circqueue *q,int x) {

   if(isfullqueue(q))
      printf("queue overflow\n");
   else{
      q->rear=(q->rear+1)%q->capacity;
      q->array[q->rear]=x;
      if(q->front==-1) {
         q->front=q->rear;
      }
   }
}

int dequeue(struct circqueue *q) {
   int data=0;

   if(isemptyqueue(q)) {
      printf("queue underflow");
      return 0;
   }
   else {
      data=q->array[q->front];
      if(q->front==q->rear)
         q->front=q->rear=-1;
      else
         q->front=(q->front+1)%q->capacity;
   }

   return data;
}

我无法理解struct circqueue *q(int size)的确切用法? 它是一个初始化队列的函数吗?还有如何从main()调用它?任何人都可以向我解释。谢谢

2 个答案:

答案 0 :(得分:3)

struct circqueue* q(int size)
{
    struct circqueue *q=malloc(sizeof(struct circqueue));
    if(!q)
        return NULL;
    q->capacity=size;
    q->front=-1;
    q->rear=-1;
    q->array=malloc(q->capacity*sizeof(int));
    if(!q->array)
       return NULL;
    return q;
}

逐行采取。

1)函数q将队列的最大大小作为参数并返回队列对象(C结构)。

3)在堆上存储struct,设置q以引用此内存位置

4)如果内存分配失败,则返回合适的非成功消息。

6)使用调用者使用的最大大小值填充circqueue容量。

7)和8)'push'和'pop'位置的内部指数。

9)为内部用于存储的数组分配堆内存。

10)有点像4)

12)将构造的对象返回给调用者。

要创建一个最多可容纳100个整数的队列,请执行以下操作:

struct circqueue* num_q = q(100);

/* Add an integer */
enqueue(num_q, 3);

答案 1 :(得分:2)

是的,它会初始化struct circqueue的一个实例,并为您提供指针:

int main()
{
    struct circqueue *queue = q( 10 );

    // do stuff with queue

    free( queue->array );
    free( queue );
}