C语言——数组实现循环队列,类C++
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 ",val); } return 0; }
测试
#include "queue.h" int main() { queue_test(); return 0; }