C语言——数组实现循环队列,类C++
实现思路
数据进入只操作队列尾部,离开队列只操作队列头部,循环可以使用取余的操作来实现。
使用函数指针实现面向对象的思想。
头文件
对外提供接口,提供使用方法,包含一个测试函数。
#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED
#define MAX_LEN 50
typedef int ElemType;
typedef struct QUEUE
{
int front;
int rear;
int length;
ElemType data[MAX_LEN];
int (*full)(struct QUEUE *Q);
int (*empty)(struct QUEUE *Q);
int (*push)(struct QUEUE *Q,ElemType elem);
int (*pop)(struct QUEUE *Q,ElemType *elem);
}QUEUE_T;
void queue_init(QUEUE_T *Q);
int queue_test();
#endif // QUEUE_H_INCLUDED
C文件
#include <stdio.h>
#include "queue.h"
static int is_full(QUEUE_T *Q);
static int is_empty(QUEUE_T *Q);
static int queue_enter(QUEUE_T *Q,ElemType elem);
static int queue_leave(QUEUE_T *Q,ElemType *elem);
void queue_init(QUEUE_T *Q)
{
Q->front=0;
Q->rear=0;
Q->length=0;
Q->full=is_full;
Q->empty=is_empty;
Q->push=queue_enter;
Q->pop=queue_leave;
}
int is_full(QUEUE_T *Q)
{
if(Q->front ==(Q->rear+1)%MAX_LEN)
return 1;
else
return 0;
}
int is_empty(QUEUE_T *Q)
{
if(Q->front==Q->rear)
return 1;
else
return 0;
}
int queue_enter(QUEUE_T *Q,ElemType elem)
{
if(is_full(Q))
return 0;
Q->data[Q->rear]=elem;
Q->length++;
Q->rear=(Q->rear+1)%MAX_LEN;
return 1;
}
int queue_leave(QUEUE_T *Q,ElemType *elem)
{
if(is_empty(Q))
return 0;
*elem=Q->data[Q->front];
Q->length--;
Q->front=(Q->front+1)%MAX_LEN;
return 0;
}
int queue_test()
{
QUEUE_T q;
queue_init(&q);
int i;
for(i=0;i<20;i++)
{
q.push(&q,i);
}
for(i=0;i<20;i++)
{
int val;
q.pop(&q,&val);
printf("%d\n",val);
}
return 0;
}
测试
#include "queue.h"
int main()
{
queue_test();
return 0;
}