【NJUPT】 数据结构与算法分析_银行排队系统

银行排队系统
【问题描述】
试设计一个银行排队系统,模拟一般银行的日常对外营业服务,包括顾客到达、等待、办理业务及离开等事件。要求体现“先来先服务”的原则,将传统物理的多个顾客排队队列变为一个逻辑队列处理,顾客只需取票(即刻进队,排队),等待叫号即可。
【基本要求】
设计程序,要求能够实现以下功能:
(1)顾客到达银行时能拿到排队号码,并能知道需要等待的人数。如果是VIP顾客,那么能直接进入VIP窗口办理,无需加入普通顾客的等待;
(2)可以查看每个银行窗口正在给第几号顾客办理业务;
(3)顾客离开银行时,可以对银行窗口职员的服务进行评价。

感谢以下两位大佬,salute!

@小白白^

@电脑迷2013

VS2022版:

#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include<conio.h>
static int i = 1;
void date();
void CustomerReview();

typedef struct QNode
{
	int bianhao;//队内成员取到的号码
	struct QNode* next;
}QNode, * QueuePtr;

typedef struct
{
	QueuePtr front;//队头指针
	QueuePtr rear;//队尾指针
}Queue;//创建链式队列

void initQueue(Queue* q)//队列的初始化
{
	q->front = q->rear = (QNode*)malloc(sizeof(QNode));
	if (!q->front)//初始化失败退出
	{
		return;
	}
	q->front->next = NULL;
}

Queue s1, s2, s3;//创建三个队列窗口

int shows1()//显示1窗口人员
{
	QNode* p = (QNode*)malloc(sizeof(QNode));
	if (s1.front == s1.rear)
	{//队列为空队列
		printf("当前无排队人员 *\n");
		return 0;
	}
	p = s1.front->next;
	while (p)
	{
		printf("%d ", p->bianhao);
		p = p->next;
	}
	printf("\n");
}

int shows2()//显示2窗口人员
{
	QNode* p = (QNode*)malloc(sizeof(QNode));
	if (s2.front == s2.rear)
	{//队列为空队列
		printf("当前无排队人员 *\n");
		return 0;
	}
	p = s2.front->next;
	while (p)
	{
		printf("%d ", p->bianhao);
		p = p->next;
	}
	printf("\n");
}

int shows3()//显示3窗口人员
{
	QNode* p = (QNode*)malloc(sizeof(QNode));
	if (s3.front == s3.rear)
	{//队列为空队列
		printf("当前无排队人员 *\n");
		return 0;
	}
	p = s3.front->next;
	while (p)
	{
		printf("%d ", p->bianhao);
		p = p->next;
	}
	printf("\n");
}

void show()//总显示窗口
{
	printf("\n\t\t\t\t\t*1号窗口排队人员:");
	shows1();
	printf("\n\t\t\t\t\t*2号窗口排队人员:");
	shows2();
	printf("\n\t\t\t\t\t*3号窗口排队人员:");
	shows3();
	printf("\t\t\t\t\t");
	system("pause");
}


void EnQueue1(Queue* q, int i)//队列插入
{
	QNode* p = (QNode*)malloc(sizeof(QNode));
	p->bianhao = i;
	p->next = NULL;
	q->rear->next = p;
	q->rear = p;
}

int  DeQueue(Queue* q, int e)//队列删除
{
	if (q->front == q->rear)
	{//队列为空队列
		return 1;
	}
	QNode* p = (QNode*)malloc(sizeof(QNode));
	p = q->front->next;
	e = p->bianhao;
	q->front->next = p->next;
	if (q->rear == p)
	{
		q->rear = q->front;
	}
	free(p);
}

void EnQueue()//选择窗口插入
{
	show();
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*请选择窗口服务:\t\t*\n");
	printf("\t\t\t\t\t*\t     1.1号窗口          *\n");
	printf("\t\t\t\t\t*\t     2.2号窗口          *\n");
	printf("\t\t\t\t\t*\t     3.3号窗口          *\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf_s("%d", &a);
	switch (a)
	{
	case 1:
	{
		EnQueue1(&s1, i);
		printf("\t\t\t\t\t*取号成功,你是1号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
		i++;
		break;
	}
	case 2:
	{
		EnQueue1(&s2, i);
		printf("\t\t\t\t\t*取号成功,你是2号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
		i++;
		break;
	}
	case 3:
	{
		EnQueue1(&s3, i);
		printf("\t\t\t\t\t*取号成功,你是3号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
		i++;
		break;
	}
	default:
	{
		printf("\t\t\t\t\t*            无效窗口           *\n\t\t\t\t\t\n");
		printf("\t\t\t\t\t*        ");
		break;
	}
	}
	system("pause");
	system("cls");
}

void vip1(Queue* q, int i)//vip头插
{
	QNode* p = (QNode*)malloc(sizeof(QNode));
	if (q->front == q->rear)
	{
		p->bianhao = i;
		p->next = NULL;
		q->rear->next = p;
		q->rear = p;
	}
	else
	{
		p->bianhao = i;
		p->next = q->front->next;
		q->front->next = p;
	}
}

void vip2()//vip插队
{
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*请选择窗口服务:\t\t*\n");
	printf("\t\t\t\t\t*\t     1.1号窗口          *\n");
	printf("\t\t\t\t\t*\t     2.2号窗口          *\n");
	printf("\t\t\t\t\t*\t     3.3号窗口          *\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf_s("%d", &a);
	switch (a)
	{
	case 1:
	{
		vip1(&s1, i);
		printf("\t\t\t\t\t*取号成功,你是1号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
		i++;
		break;
	}
	case 2:
	{
		vip1(&s2, i);
		printf("\t\t\t\t\t*取号成功,你是2号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
		i++;
		break;
	}
	case 3:
	{
		vip1(&s3, i);
		printf("\t\t\t\t\t*取号成功,你是3号窗口%d号,请等待办理*\n\t\t\t\t\t", i);
		i++;
		break;
	}
	default:
	{
		printf("\t\t\t\t\t*            无效窗口           *\n\t\t\t\t\t\n");
		printf("\t\t\t\t\t*        ");
		break;
	}
	}
	system("pause");
	system("cls");
}

int CallNum(Queue* q)//查找/叫号功能 
{
	printf("\t\t\t\t\t*       请输入所取的号码:");
	int a;
	int b = 1;
	scanf_s("%d", &a);
	QNode* p = q->front->next;
	while (p && p->bianhao != a)
	{
		p = p->next;
		b++;
	}
	if (p == NULL || p->bianhao != a)
	{
		printf("\t\t\t\t\t*  对不起,您输入的号码不存在! *\n");
		printf("\t\t\t\t\t");
		system("pause");
		return 1;
	}
	if (b == 1)
	{
		printf("\t\t\t\t\t*\t  你现在是第1位!  \t*\n");
		int e = 0;
		DeQueue(q, e);
		printf("\t\t\t\t\t*\t    办理完成!    \t*\n");
		CustomerReview();
	}
	if (b != 1 && (p != NULL || p->bianhao == a))
	{
		printf("\t\t\t\t\t*   你现在是第%d位,请等候谢谢! *\n", b);
		printf("\t\t\t\t\t");
		system("pause");
	}
	return 1;
}

void CounterServer()//柜员
{
	printf("\t\t\t\t\t* 柜员您好,请输入您的服务窗口:*\n");
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*\t     1.1号窗口          *\n");
	printf("\t\t\t\t\t*\t     2.2号窗口          *\n");
	printf("\t\t\t\t\t*\t     3.3号窗口          *\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf_s("%d", &a);
	switch (a)
	{
	case 1:
	{
		printf("\t\t\t\t\t*\t1号窗口:");
		shows1();
		CallNum(&s1);
		break;
	}

	case 2:
	{
		printf("\t\t\t\t\t*\t2号窗口:");
		shows2();
		CallNum(&s2);
		break;
	}
	case 3:
	{
		printf("\t\t\t\t\t*\t3号窗口:");
		shows3();
		CallNum(&s3);
		break;
	}
	default:
	{
		printf("\t\t\t\t\t*\t    无效柜号   \t\t*\n\t\t\t\t\t\n");
		printf("\t\t\t\t\t*        ");
		system("pause");
		system("cls");
		break;
	}
	}
}

void CustomerReview()
{
	printf("\n\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*\t请对本次服务做出评价\t*\n");
	printf("\t\t\t\t\t*\t1.非常满意!\t\t*\n");
	printf("\t\t\t\t\t*\t2.比较满意!\t\t*\n");
	printf("\t\t\t\t\t*\t3.一般!\t\t*\n");
	printf("\t\t\t\t\t*\t4.不满意!\t\t*\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf_s("%d", &a);
	while (a < 1 || a > 4)
	{
		printf("\t\t\t\t\t*  您的输入不正确,请重新输入: ");
		scanf_s("%d", &a);
	}
	switch (a)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	{
		printf("\t\t\t\t\t*   非常感谢你的评价!谢谢!    *\n");
		printf("\t\t\t\t\t*\t");
		system("pause");
		system("cls");
		break;
	}
	default:break;
	}

}

void esc()
{
	exit(0);
}

void menu()
{
	date();
	printf("\n\n\n\n\n\n\n\n\n");
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t***********银行排队系统**********\n");
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*\t请选择服务:\t\t*\n");
	printf("\t\t\t\t\t*\t1.普通用户排队\t\t*\n");
	printf("\t\t\t\t\t*\t2.vip用户通道\t\t*\n");
	printf("\t\t\t\t\t*\t3.显示各窗口等待人数\t*\n");
	printf("\t\t\t\t\t*\t4.柜员服务界面\t\t*\n");
	printf("\t\t\t\t\t*\t0.退出系统\t\t*\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf_s("%d", &a);
	switch (a)
	{
	case 1:
	{
		system("cls");
		date();
		printf("\t\t\t\t\t*\t1.普通用户排队\t\t*\n");
		EnQueue();
		break;
	}
	case 2:
	{
		system("cls");
		date();
		printf("\t\t\t\t\t*\t2.vip用户通道\t\t*\n");
		vip2();
		break;
	}
	case 3:
	{
		system("cls");
		date();
		printf("\t\t\t\t\t*\t3.显示各窗口等待人数\t*\n");
		show();
		system("cls");
		break;
	}
	case 4:
	{
		system("cls");
		date();
		printf("\t\t\t\t\t*\t4.柜员服务界面\t\t*\n");
		CounterServer();
		system("cls");
		break;
	}
	case 0:
	{
		esc();
		break;
	}
	default:
	{
		printf("\t\t\t\t\t*\t  服务项输入有误  \t*\n");
		printf("\t\t\t\t\t*\t");
		system("pause");
		system("cls");
		break;
	}
	}
}

void date()
{
	time_t rawtime;
	struct tm timeinfo;
	char buffer[128];
	time(&rawtime);
	localtime_s(&timeinfo, &rawtime);
	strftime(buffer, sizeof(buffer), "%Y/%m/%d %H:%M:%S", &timeinfo);
	puts(buffer);
}

int main()//
{
	system("color 0b");
	static int i = 1;
	initQueue(&s1);
	initQueue(&s2);
	initQueue(&s3);
	while (1)
	{
		menu();
	}
}

DevCpp版:

#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include<conio.h>
static int i=1;
//void menu();
void date ();
void CustomerReview();

typedef struct QNode
{	int bianhao;//队内成员取到的号码
	struct QNode *next;
}QNode,* QueuePtr;  

typedef struct
{	QueuePtr front;//队头指针
	QueuePtr rear;//队尾指针
}Queue;//创建链式队列

void initQueue(Queue *q)//队列的初始化
{
    q->front=q->rear=(QNode *)malloc(sizeof(QNode));
    if (!q->front)//初始化失败退出
    {
        return;
    }
    q->front->next=NULL;
}

Queue s1,s2,s3;//创建三个队列窗口

int shows1()//显示1窗口人员
{
	QNode *p = (QNode *)malloc(sizeof(QNode));
	if(s1.front==s1.rear)
	{//队列为空队列
	printf("当前无排队人员 *\n");
	return 0;
	}
p=s1.front->next;
while(p)
	{
		printf("%d ",p->bianhao);
		p=p->next;
	}
printf("\n");
}

int shows2()//显示2窗口人员
{
	QNode *p = (QNode *)malloc(sizeof(QNode));
	if(s2.front==s2.rear)
	{//队列为空队列
	printf("当前无排队人员 *\n");
    return 0;
	}
p=s2.front->next;
while(p)
	{
		printf("%d\t",p->bianhao);
		p=p->next;
	}
printf("\n");
}

int shows3()//显示3窗口人员
{
	QNode *p = (QNode *)malloc(sizeof(QNode));
	if(s3.front==s3.rear){//队列为空队列
	printf("当前无排队人员 *\n");
	return 0;
}
p=s3.front->next;
while(p)
	{
		printf("%d\t",p->bianhao);
		p=p->next;
	}
printf("\n");
}

void show()//总显示窗口
{
	printf("\n\t\t\t\t\t*1号窗口排队人员:");
	shows1();
	printf("\n\t\t\t\t\t*2号窗口排队人员:");
	shows2();
	printf("\n\t\t\t\t\t*3号窗口排队人员:");
	shows3();
	printf("\t\t\t\t\t");
	system("pause");
}
 

void EnQueue(Queue &q,int &i)//队列插入
{
	QNode *p = (QNode *)malloc(sizeof(QNode));
	p->bianhao=i;
	p->next=NULL;
	q.rear->next=p;
	q.rear=p;
}

int  DeQueue(Queue &q,int &e)//队列删除
{
	if(q.front==q.rear)
	{//队列为空队列
		return 1;
	}
	QNode *p = (QNode *)malloc(sizeof(QNode));
	p=q.front->next;
	e=p->bianhao;
	q.front->next=p->next;
	if(q.rear==p)
	{
		q.rear=q.front;
	}
	free(p);
}
 
void EnQueue()//选择窗口插入
{
	show();
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*请选择窗口服务:\t\t*\n");
	printf("\t\t\t\t\t*\t     1.1号窗口          *\n");
	printf("\t\t\t\t\t*\t     2.2号窗口          *\n");
	printf("\t\t\t\t\t*\t     3.3号窗口          *\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf("%d",&a);
	switch(a)
	{
	case 1:
		{
			EnQueue(s1,i);
			printf("\t\t\t\t\t*取号成功,你是1号窗口%d号,请等待办理*\n\t\t\t\t\t",i);
			i++;
			break;
		}
	case 2:
		{
			EnQueue(s2,i);
			printf("\t\t\t\t\t*取号成功,你是2号窗口%d号,请等待办理*\n\t\t\t\t\t",i);
			i++;
			break;
		}
	case 3:
		{
			EnQueue(s3,i);
			printf("\t\t\t\t\t*取号成功,你是3号窗口%d号,请等待办理*\n\t\t\t\t\t",i);
			i++;
			break;
		}
	default:
		{		
			printf("\t\t\t\t\t*            无效窗口           *\n\t\t\t\t\t\n");
			printf("\t\t\t\t\t*        ");
			break;
		}
	}
	system("pause");
	system("cls");
}

void vip1(Queue &q,int &i)//vip头插
{
	QNode *p = (QNode *)malloc(sizeof(QNode));
	if(q.front==q.rear)
	{
		p->bianhao=i;
		p->next=NULL;
		q.rear->next=p;
		q.rear=p;
	}
	else
	{
		p->bianhao=i;
		p->next=q.front->next;
		q.front->next=p;
	}
}

void vip2()//vip插队
{
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*请选择窗口服务:\t\t*\n");
	printf("\t\t\t\t\t*\t     1.1号窗口          *\n");
	printf("\t\t\t\t\t*\t     2.2号窗口          *\n");
	printf("\t\t\t\t\t*\t     3.3号窗口          *\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf("%d",&a); 
switch(a)
{
	case 1:
		{
    		vip1(s1,i);
    		printf("\t\t\t\t\t*取号成功,你是1号窗口%d号,请等待办理*\n\t\t\t\t\t",i);
    		i++;
    		break;
		}
	case 2:
		{
    		vip1(s2,i);
    		printf("\t\t\t\t\t*取号成功,你是2号窗口%d号,请等待办理*\n\t\t\t\t\t",i);
    		i++;
    		break;
		}
	case 3:
		{
    		vip1(s3,i);
    		printf("\t\t\t\t\t*取号成功,你是3号窗口%d号,请等待办理*\n\t\t\t\t\t",i);
    		i++;
    		break;
		}
	default:
		{
			printf("\t\t\t\t\t*            无效窗口           *\n\t\t\t\t\t\n");
			printf("\t\t\t\t\t*        ");
			break;
		}
}
system("pause");
system("cls");
}

int CallNum(Queue &q)//查找/叫号功能 
{
    printf("\t\t\t\t\t*       请输入所取的号码:");
    int a;
    int b = 1;
    scanf("%d", &a);
    QNode *p = q.front->next;
    while (p && p->bianhao != a)
    {
        p = p->next;
        b++;
    }
    if (p == NULL || p->bianhao != a)
    {
        printf("\t\t\t\t\t*  对不起,您输入的号码不存在! *\n");
        printf("\t\t\t\t\t");
        system("pause");
        return 1;
    }
    if (b == 1)
    {
        printf("\t\t\t\t\t*\t  你现在是第1位!  \t*\n");
        int e = 0;
        DeQueue(q, e);
        printf("\t\t\t\t\t*\t    办理完成!    \t*\n");
        CustomerReview();
    }
    if (b != 1&&(p != NULL || p->bianhao == a))
    {
        printf("\t\t\t\t\t*   你现在是第%d位,请等候谢谢! *\n", b);
        printf("\t\t\t\t\t");
        system("pause");
    }
    return 1;
}

void CounterServer()//查询排队进度
{
	printf("\t\t\t\t\t* 柜员您好,请输入您的服务窗口:*\n");
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*\t     1.1号窗口          *\n");
	printf("\t\t\t\t\t*\t     2.2号窗口          *\n");
	printf("\t\t\t\t\t*\t     3.3号窗口          *\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf("%d",&a);
	switch(a)
	{
		case 1:
			{
				printf("\t\t\t\t\t*\t1号窗口:");
				shows1();
				CallNum(s1);
				break;
			}

		case 2:
			{
				printf("\t\t\t\t\t*\t2号窗口:");
				shows2();
				CallNum(s2);
				break;
			}
		case 3:
			{
				printf("\t\t\t\t\t*\t3号窗口:");
				shows3();
				CallNum(s3);
				break;
			}
		default:
			{	
				printf("\t\t\t\t\t*\t    无效窗口   \t\t*\n\t\t\t\t\t\n");
				printf("\t\t\t\t\t*        ");
				system("pause");
        		system("cls");
				break;
			}
	}
}

void CustomerReview()
{
	printf("\n\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*\t请对本次服务做出评价\t*\n");
	printf("\t\t\t\t\t*\t1.非常满意!\t\t*\n");
	printf("\t\t\t\t\t*\t2.比较满意!\t\t*\n");
	printf("\t\t\t\t\t*\t3.一般!\t\t*\n");
	printf("\t\t\t\t\t*\t4.不满意!\t\t*\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf("%d",&a);
	while (a < 1 || a > 4) 
	{
        printf("\t\t\t\t\t*  您的输入不正确,请重新输入: ");
        scanf("%d", &a);
    }
	switch(a)
	{
		case 1:
		case 2:
		case 3:
		case 4: 
			{
				printf("\t\t\t\t\t*   非常感谢你的评价!谢谢!    *\n");
				printf("\t\t\t\t\t*\t");
				system("pause");
				system("cls");
				break;
			}
		default:break;
	}

}

void exit()
{
	exit(0);
}

void menu()
{
	date ();
	printf("\n\n\n\n\n\n\n\n\n");
    printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t***********银行排队系统**********\n");
	printf("\t\t\t\t\t*********************************\n");
	printf("\t\t\t\t\t*\t请选择服务:\t\t*\n");
	printf("\t\t\t\t\t*\t1.普通用户排队\t\t*\n");
	printf("\t\t\t\t\t*\t2.vip用户通道\t\t*\n");
	printf("\t\t\t\t\t*\t3.显示各窗口等待人数\t*\n");
	printf("\t\t\t\t\t*\t4.柜员服务界面\t\t*\n");
	printf("\t\t\t\t\t*\t0.退出系统\t\t*\n");
	printf("\t\t\t\t\t*********************************\n");
	int a;
	printf("\t\t\t\t\t");
	scanf("%d",&a);
	switch(a)
	{
		case 1:
			{
        		system("cls");
        		date ();
        		printf("\t\t\t\t\t*\t1.普通用户排队\t\t*\n");
				EnQueue();
				break;
			}
		case 2:
			{
				system("cls");
				date ();
				printf("\t\t\t\t\t*\t2.vip用户通道\t\t*\n");
				vip2();
				break;
			}
		case 3:
			{
				system("cls");
				date ();
				printf("\t\t\t\t\t*\t3.显示各窗口等待人数\t*\n");
				show();
				system("cls");
				break;
			}

		case 4:
			{
				system("cls");
				date ();
				printf("\t\t\t\t\t*\t4.柜员服务界面\t\t*\n");
				CounterServer();
    			system("cls");
				break;
			}
		case 0:
			{
				exit();
				break;
			}
		default:
			{
				printf("\t\t\t\t\t*\t  服务项输入有误  \t*\n");
				printf("\t\t\t\t\t*\t");
				system("pause");
    			system("cls");
				break;
			}
	}
}

void date()
{
  time_t rawtime;
  struct tm * timeinfo;
  char buffer [128];
  time (&rawtime);
  timeinfo = localtime (&rawtime);
  strftime (buffer,sizeof(buffer),"%Y/%m/%d %H:%M:%S",timeinfo);
  puts (buffer);
}

int main()//
{ 
	system("color 0b") ;
	static int i=1;
	initQueue(&s1);
	initQueue(&s2);
	initQueue(&s3);
	while(1)
	{
       menu();
	}
}

  • 13
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
银行排队系统数据结构可以采用链式队列来实现。具体实现步骤如下: 1. 首先,我们需要定义一个队列的节点类,包含两个属性:数据域和指针域。数据域用来存储队列中的元素,指针域用来指向下一个节点。 2. 然后,我们需要定义一个队列类,包含两个指针:队头指针和队尾指针。队头指针指向队列中的第一个元素,队尾指针指向队列中的最后一个元素。 3. 接下来,我们需要实现队列的基本操作:入队和出队。入队操作将元素插入到队列的末尾,出队操作将队列中的第一个元素删除并返回。 4. 在银行排队系统中,我们需要创建多个队列来模拟多个业务窗口。每个队列都有自己的队头指针和队尾指针,用来管理队列中的元素。 5. 最后,我们需要实现事件链表来模拟同时执行。事件链表中存储两种事件:进入事件和离开事件。进入事件代表一个人进入银行,离开事件代表一个人办理完业务离开银行。 以下是Python代码示例: ```python # 定义队列节点类 class Node: def __init__(self, data): self.data = data self.next = None # 定义队列类 class Queue: def __init__(self): self.head = None self.tail = None # 入队操作 def enqueue(self, data): new_node = Node(data) if self.tail: self.tail.next = new_node else: self.head = new_node self.tail = new_node # 出队操作 def dequeue(self): if self.head: data = self.head.data self.head = self.head.next if not self.head: self.tail = None return data else: return None # 创建多个队列来模拟多个业务窗口 queue1 = Queue() queue2 = Queue() queue3 = Queue() queue4 = Queue() # 定义事件链表节点类 class EventNode: def __init__(self, time, event_type, customer_id): self.time = time self.event_type = event_type self.customer_id = customer_id self.next = None # 定义事件链表类 class EventList: def __init__(self): self.head = None # 插入事件 def insert_event(self, time, event_type, customer_id): new_node = EventNode(time, event_type, customer_id) if not self.head or time < self.head.time: new_node.next = self.head self.head = new_node else: current = self.head while current.next and current.next.time <= time: current = current.next new_node.next = current.next current.next = new_node # 删除事件 def delete_event(self): if self.head: time = self.head.time event_type = self.head.event_type customer_id = self.head.customer_id self.head = self.head.next return time, event_type, customer_id else: return None, None, None # 创建事件链表 event_list = EventList() ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值