首页 > 代码库 > 队列之银行排号模拟

队列之银行排号模拟

//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 = http://www.mamicode.com/CycQueueOut(q);		//出队>



队列之银行排号模拟