以下循环队列实现来自数据结构书。
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()调用它?任何人都可以向我解释。谢谢
答案 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 );
}