队列之银行排号模拟

//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

队列之银行排号模拟的相关文章

队列学习笔记 银行排号程序

 //循环队列  //CycQueue.h #define QUEUEMAX 15 typedef struct  { DATA data[QUEUEMAX];  //队列数组  int head; //队头  int tail; //队尾  }CycQueue; CycQueue *CycQueueInit () { CycQueue *q; if(q=(CycQueue *)malloc(sizeof(CycQueue))) //申请保存队列的内存  { q->head = 0;  //设置

ytu 1067: 顺序排号(约瑟夫环)

1067: 顺序排号Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 31  Solved: 16[Submit][Status][Web Board] Description 有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. Input 初始人数n Output 最后一人的初始编号 Sample Input 3 Sample Output 2 HINT Source freepro

C#:根据银行卡卡号推断银行名称

原文:C#:根据银行卡卡号推断银行名称 原文地址:android 根据银行卡卡号判断银行 原文是 java ,现在将它翻译成 C# ,并对代码重新编排整理,不足之处请多多包涵. 根据银行卡号判断所属银行,依据是卡号的前6位数,称之为bin号. 我们把bin号转化为长整形,再把各个银行卡的bin号做成有序表.通过二分查找的方法,找到bin号在有序表的位置,然后读出银行卡的信息. 1.创建项目:BankInfoDemo(控制台应用程序) 2.新建类:BankInfo.cs 1 /// <summar

C#:根据银行卡卡号判断银行名称

原文地址:android 根据银行卡卡号判断银行 原文是 java ,现在将它翻译成 C# ,并对代码重新编排整理,不足之处请多多包涵. 根据银行卡号判断所属银行,依据是卡号的前6位数,称之为bin号. 我们把bin号转化为长整形,再把各个银行卡的bin号做成有序表.通过二分查找的方法,找到bin号在有序表的位置,然后读出银行卡的信息. 1.创建项目:BankInfoDemo(控制台应用程序) 2.新建类:BankInfo.cs 1 /// <summary> 2 /// 银行信息 3 ///

基于KMP与Levenshtein模糊匹配算法的银行联行号查询(转)

在人民银行那里,每个银行的每一个营业网点都有自己唯一的银行联行号,根据这个号码能快速定位一间银行具体的分支行,就像根据一个身份证号码能快速确定一个人一样.例如汇款时,汇款单上要求填写收款人开户行,然后银行会把收款人开户行的联行号连其他信息发到人民银行进行清算,这样能保证以最快的速度汇到收款人的手上.如果联行号不准确,那么在汇款的时候会发生分行落地,支行间调拨等操作,影响导致时间,尤其是跨行汇款的时候.一般银行的代收付接口,都会要求提供此参数. 银行联行号一般是根据输入的分支行信息模糊查询出来的,

判断银行卡卡号输入的合法性接口

// 判断银行卡卡号输入的合法性 //参数:输入银行卡号,判断银行卡号是否为合法的银行卡卡号(YES 为合法) - (BOOL) checkCardNo:(NSString*) cardNo;  判断银行卡卡号输入的合法性接口 #pragma mark ---——————————————————————————判断银行卡卡号输入的合法性---—————————————————————————— - (BOOL) checkCardNo:(NSString*) cardNo{ int oddsum

基于KMP与Levenshtein模糊匹配算法的银行联行号查询

在人民银行那里,每个银行的每一个营业网点都有自己唯一的银行联行号,根据这个号码能快速定位一间银行具体的分支行,就像根据一个身份证号码能快速确定一个人一样.例如汇款时,汇款单上要求填写收款人开户行,然后银行会把收款人开户行的联行号连其他信息发到人民银行进行清算,这样能保证以最快的速度汇到收款人的手上.如果联行号不准确,那么在汇款的时候会发生分行落地,支行间调拨等操作,影响导致时间,尤其是跨行汇款的时候.一般银行的代收付接口,都会要求提供此参数. 银行联行号一般是根据输入的分支行信息模糊查询出来的,

C语言学习之用队列实现银行排队系统

队列操作的接口:http://blog.csdn.net/qlx846852708/article/details/43666927 数据结构C语言实现:http://blog.csdn.net/qlx846852708?viewmode=contents 本文件是用队列实现银行排队系统,上面的连接是我实现的队列的接口实现. #include <stdio.h> #include <stdlib.h> #include <string.h> #include "

取客户的银行帐号SQL

SELECT ibybanks.bank_name, --银行 ibybanks.bank_branch_name, --分行 ibybanks.bank_account_num_electronic--银行帐号 FROM iby_external_payers_all iepa, iby_pmt_instr_uses_all ipiua, iby_ext_bank_accounts_v ibybanks WHERE iepa.payment_function = 'CUSTOMER_PAYME