数据结构简单模拟银行排队系统

数据结构 队列

银行排队系统实现

功能要求:

(1) 客户进入排队系统;

(2) 客户离开;

(3) 查询当前客户前面还有几人;

(4) 查询截至目前总共办理多少客户。

输出要求:每进行一次操作后,输出当前排队成员情况。

算法实现
首先创建一个空队列即银行排队队列,再向其中执行插入,删除,查询等操作。在执行插入操作时要判断队列是否已达最大长度,否则不能插入。在删除时要判断队列是否为空,否则不能执行删除操作。删除以后若队列为空,则需要将队尾指向对头。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define OK      1
#define ERROR   0
#define TRUE 1  
#define FALSE 0  
//define the structure node

int m = 0;
typedef int Status;
typedef int QElemType;


typedef struct queue//结点结构
{
	int value;
	struct queue* next;
}Queue, *QueuePtr;


typedef struct linkqueue
{
	Queue *front;//头指针  
	Queue *tail;//尾指针  
}LinkQueue;

#define QUEUE_LEN  sizeof(Queue)



int initQueue(LinkQueue*);//创建一个队列


int EmptyQueue(LinkQueue*);//判断队列是否为控


int enterQueue(LinkQueue*, int value);//插入元素value为Q的新的队尾元素


int deQueue(LinkQueue*);//删除元素


int printQueue(LinkQueue*);//输出队列

int Query(LinkQueue*, int);//查询元素myNum在队列中的位置


#include<stdio.h>
#include<stdlib.h>




int initQueue(LinkQueue* Q)//构造一个空队列Q
{
	printf("Init a queue ......\n");
	if (!(Q->front = Q->tail = (Queue*)malloc(QUEUE_LEN)))
	{
		printf("ERROR:Malloc Error !\n");
		return ERROR;
	}
	Q->front->next = NULL;
	return OK;
}

int enterQueue(LinkQueue* Q, int enterValue)//插入元素enterValue为Q的新的队尾元素
{
	Queue* tmpNode = NULL;
	if (!(tmpNode = (Queue*)malloc(QUEUE_LEN)))
	{
		printf("ERROR:Malloc Error !\n");
		return ERROR;
	}

	tmpNode->value = enterValue;
	tmpNode->next = NULL;
	Q->tail->next = tmpNode;
	Q->tail = tmpNode;

}


int EmptyQueue(LinkQueue *Q) //若队列Q为空,返回TRUE,否则返回FALSE  
{
	if (Q->front==Q->tail)
		
		return TRUE;
	else

		return FALSE;

}

int printQueue(LinkQueue* Q)//将队列中每个元素输出
{
	Queue* tmpNode = NULL;
	tmpNode = Q->front->next;
	if (NULL == tmpNode)
	{
		printf("无人排队\n");
		return ERROR;

	}

	while (tmpNode != Q->tail)
	{
		printf("%d  ", tmpNode->value);
		tmpNode = tmpNode->next;
	}
	printf("%d\n", Q->tail->value);

}

int deQueue(LinkQueue*Q, QElemType *e)//若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
{
	QueuePtr p;
	if (EmptyQueue(Q))
	{
		printf("无人离开\n");
		return ERROR;
	}
	p = Q->front->next;
	*e = p->value;
	Q->front->next = p->next;
	m++;
	if (Q->tail == p)//如果队列中只有一个元素 
		Q->tail = Q->front;//此时应当让队尾指针指向队头,否则可能将队尾指针释放掉
	free(p);
	return OK;
}

int Query(LinkQueue* Q, int myNum)//查询元素myNum在队列中的位置
{
	int numOfMan = 0;
	if (EmptyQueue(Q))
	{
		printf("无人排队\n");
		return ERROR;
	}
	else if (myNum==Q->front->value==Q->tail->value)
	{
		return ERROR;
	}
	else if (myNum > Q->tail->value || myNum < Q->front->value)
	{
		printf("对不起,您输入了一个错误的号码\n");
		return ERROR;
	}

	else
	{
		numOfMan = myNum -( Q->front->next->value);
		return  numOfMan;
	}
}

#include<stdio.h>
#include<string.h>
static  int bankNumber = 0;
static int totalNumber = 0;
int stopBank();
int startBank();
int flag = 1;

int main()
{
	int choice = 0;
	int d;
	int num = 0;
	LinkQueue Q;
	initQueue(&Q);
	while (1)
	{
		printf("\n\n#########银行排队系统 #############\n");
		printf("###           1:客户进入排队系统;          \n");
		printf("###           2:客户离开银行    \n");
		printf("###           3:查询当前客户前面还有几人                      \n");
		printf("###           4:查询截止目前总共办理多少客户             \n");
		printf("###           5:EXIT                        \n");
		printf("   请选择[1-5]:   ");
		scanf_s("%d", &choice);
		switch (choice)
		{
		case 1:
			if (flag)
			{

				bankNumber++;
				enterQueue(&Q, bankNumber);
				totalNumber++;
				printf("你的等待号码数字 %d\n", bankNumber);
				printf("%d 人在您之前,请稍等\n", Query(&Q, bankNumber));
				printf("当前的排队成员情况为:"); printQueue(&Q);
				break;
			}
			else
			{

				printf("     停止申请号码\n");
				printf("当前的排队成员情况为:"); printQueue(&Q);
				break;
			}
		case 2:
			deQueue(&Q,&d);
			printf("您(%d号)已离开银行 ....\n", d);

			totalNumber--;

			printf("当前的排队成员情况为:"); printQueue(&Q);
			break;
		case 3:

			printf("请输入您的号码:\n");
			scanf_s("%d", &num);
			printf("%d 人在您之前,请稍等\n", Query(&Q, num));

			printf("当前的排队成员情况为:"); printQueue(&Q);
			break;
		case 4:
			printf("截止目前总共办理%d个客户\n", m);
			printf("当前的排队成员情况为:"); printQueue(&Q);
			break;
		case 5:
			exit(0);
			break;
		default:
			break;

		}

	}

	return OK;
}


int stopBank()
{
	flag = 0;

	return 0;
}

int startBank()

{
	flag = 1;
	return 0;

}

运行结果在这里插入图片描述

1、客户进入排队系统在这里插入图片描述

2、客户离开银行
在这里插入图片描述

3、查询当前客户前面还有几人
在这里插入图片描述

4、查询截止目前总共办理多少客户
在这里插入图片描述

  • 50
    点赞
  • 291
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值