//CycQueue.h
/* Queue:First In First Out (FIFO) 避免假溢出:使用循环队列。 */ #define QUEUEMAX 20 //1.定义队列结构 typedef struct { DATA data[QUEUEMAX]; //队列数组 int head; //队头 int tail; //队尾 }CycQueue; //2.初始化队列 CycQueue *CycQueueInit() { CycQueue *q; if(q=(CycQueue *)malloc(sizeof(CycQueue))) { q->head = 0; //设置队头 q->tail = 0; //设置队尾 return q; }else return NULL; } void CycQueueFree(CycQueue *q) //释放队列 { if(q!=NULL) free(q); } //3.获取队列状态 int CycQueueIsEmpty(CycQueue *q) //判断队列是否为空 { return (q->head==q->tail); } int CycQueueIsFull(CycQueue *q) //判断队列是否已满 { return ((q->tail+1)%QUEUEMAX==q->head); } //4.入队操作 int CycQueueIn(CycQueue *q,DATA data) { if((q->tail+1)%QUEUEMAX == q->head) { printf("队列已满\n"); return 0; } else { q->tail = (q->tail+1)%QUEUEMAX; //求队尾序号 q->data[q->tail] = data; return 1; } } //5.出队操作 DATA *CycQueueOut(CycQueue *q) { if(q->head==q->tail) { printf("队列为空\n"); return NULL; } else { q->head = (q->head+1)%QUEUEMAX; return &(q->data[q->head]); } } //6.获取队列长度 int CycQueueLen(CycQueue *q) { int n; n=q->tail-q->head; if(n<0) n=QUEUEMAX+n; return n; } //7.获取队列中第一个位置的数据 DATA *CycQueuePeek(CycQueue *q) { if(q->head==q->tail) { printf("队列已经为空\n"); return NULL; } else { return &(q->data[(q->head+1)%QUEUEMAX]); } }
//BankQueue.c
//模拟银行顾客排号 #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct { int num; //顾客编号 long time; //进入队列时间 }DATA; #include "CycQueue.h" int num; //保存顾客的序号 void add(CycQueue *q) //新增顾客排列 { DATA data; if(!CycQueueIsFull(q)) { data.num = ++num; data.time = time(NULL); CycQueueIn(q,data); //入队 } else printf("\n当前排队人数过多,请稍后再排队\n"); } void next(CycQueue *q) //通知下一顾客准备 { DATA *data; if(!CycQueueIsEmpty(q)) { data = CycQueueOut(q); //出队 printf("\n请编号为%d的顾客办理业务\n", data->num); } if(!CycQueueIsEmpty(q)) { data = CycQueuePeek(q); //取队首元素 printf("请编号为%d的顾客准备,马上经为您办理业务\n",data->num); } } int main() { CycQueue *queue; int select; num = 0; queue = CycQueueInit(); do{ printf("\n请选择具体操作:\n"); printf("1.新到顾客\n"); printf("2.下一个顾客\n"); printf("0.退出\n"); fflush(stdin); scanf("%d",&select); switch(select) { case 1: add(queue); printf("\n现在共有%d位顾客在等候!\n",CycQueueLen(queue)); break; case 2: next(queue); printf("\n现在共有%d位顾客在等候!\n",CycQueueLen(queue)); break; case 0: break; } }while(select!=0); CycQueueFree(queue); return 0; }
时间: 2024-10-18 15:38:06