C语言数据结构实现银行模拟攻略
背景介绍
银行模拟是计算机学科中一个重要的数据结构实践练习项目。它涉及到队列(Queue)等数据结构的应用,也是计算机基础课程的一个重要组成部分。
代码实现
1. 队列的实现
首先,我们需要实现一个队列(Queue)结构体,包含 QueueSize、Front、Rear 三个成员变量:
struct Queue {
int QueueSize; //队列最大尺寸
int Front; //队列头指针
int Rear; //队列尾指针
Customer *array; //队列数组指针,元素类型是Customer
};
同时,我们还需要实现 Queue 的初始化、入队、出队等操作函数。
初始化
队列初始化函数用于初始化一个队列:
Queue* InitQueue(int size) {
Queue *queuePtr = (Queue*)malloc(sizeof(Queue));
queuePtr->QueueSize = size;
queuePtr->Front = queuePtr->Rear = 0;
queuePtr->array = (Customer*)malloc(size * sizeof(Customer));
return queuePtr;
}
入队
对于队列的入队操作,我们需要实现函数 Enqueue(Queue* queuePtr, Customer customer)
,其中 Customer
是一个结构体,包含了银行队列中的一些基本信息,如顾客编号、到达时间、等待时间、服务时间、离开时间等。
void Enqueue(Queue* queuePtr, Customer customer) {
if (queuePtr->Rear == queuePtr->QueueSize) {
printf("Queue is Full!\n");
return;
}
else {
queuePtr->array[queuePtr->Rear++] = customer;
}
}
出队
对于队列的出队操作,我们需要实现函数 Dequeue(Queue* queuePtr)
:
void Dequeue(Queue* queuePtr) {
if (queuePtr->Front == queuePtr->Rear) {
printf("Queue is Empty!\n");
return;
}
else {
++queuePtr->Front;
}
}
2. 银行模拟的实现
在进行银行模拟的实现时,我们需要考虑到顾客的到达时间、排队时间、服务时间、离开时间等因素。
顾客结构体定义
定义一个 Customer 结构体表示一位银行客户:
struct Customer {
int CustomerNo; //顾客编号
int ArrivalTime; //顾客到达时间
int WaitingTime; //顾客等待时间
int ServiceTime; //顾客服务时间
int LeavingTime; //顾客离开时间
};
顾客队列的定义与初始化
我们可以定义一个等待队列:
Queue *queuePtr = InitQueue(MAX_QUEUE_SIZE);
其中,MAX_QUEUE_SIZE
表示此银行排队放待的最大客户数量。应根据实际情况进行调整。
生成顾客
我们需要确定顾客的到达时间、服务时间两个随机数,并生成一位顾客。可以使用 rand()
函数来实现。以下示例生成顾客的函数 GenerateCustomer(int time)
:
Customer GenerateCustomer(int time) {
Customer customer;
customer.CustomerNo = ++CustomerCount; //生成顾客编号
customer.ArrivalTime = time; //记录到达时间
//随机生成服务时间(5~10分钟)
customer.ServiceTime = rand() % 6 + 5;
return customer;
}
模拟服务
我们可以将每一轮中接受服务的顾客入队,同时从队首出队并记录顾客的实际等待时间,以及退出队列的时间。
以下示例代码演示了每一轮如何处理已在队列中的顾客:
void CustomerService(Queue* queuePtr, int time) {
if(queuePtr->Front == queuePtr->Rear) {
return ;
}
else{
//记录顾客实际等待时间
queuePtr->array[ queuePtr->Front ].WaitingTime = time - queuePtr->array[ queuePtr->Front ].ArrivalTime;
//记录此顾客的离开时间
queuePtr->array[ queuePtr->Front ].LeavingTime = time + queuePtr->array[queuePtr->Front].ServiceTime;
//从队首出队,此顾客已经服务完成
Dequeue(queuePtr);
}
}
示例1:概括流程
- 定义一个等待队列
queuePtr
; - 生成顾客并将其入队,同时在每一轮中进行模拟服务;
- 记录队列中每一位顾客的等待时间和离开时间。
示例2:完整代码
银行模拟的完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_QUEUE_SIZE 10000 //等待区最大人数
#define MAX_SERVICE_TIME 10 //顾客最大服务时间
//顾客结构体
struct Customer {
int CustomerNo; //顾客编号
int ArrivalTime; //顾客到达时间
int WaitingTime; //顾客等待时间
int ServiceTime; //顾客服务时间
int LeavingTime; //顾客离开时间
};
//队列结构体
struct Queue{
int QueueSize;
int Front;
int Rear;
Customer *arrPtr;
};
int CustomerCount = 0; //顾客总数
//定义一个等待队列
Queue *queuePtr = NULL;
//初始化队列
Queue* InitQueue(int size) {
Queue *queuePtr = (Queue*)malloc(sizeof(Queue));
queuePtr->QueueSize = size;
queuePtr->Front = queuePtr->Rear = 0;
queuePtr->arrPtr = (Customer*)malloc(size * sizeof(Customer));
return queuePtr;
}
//入队
void Enqueue(Queue* queuePtr, Customer customer) {
if (queuePtr->Rear == queuePtr->QueueSize) {
printf("Queue is Full!\n");
return;
}
else {
queuePtr->arrPtr[queuePtr->Rear++] = customer;
}
}
//出队
void Dequeue(Queue* queuePtr) {
if (queuePtr->Front == queuePtr->Rear) {
printf("Queue is Empty!\n");
return;
}
else {
++queuePtr->Front;
}
}
//生成顾客函数,返回生成的顾客结构体
Customer GenerateCustomer(int time) {
Customer customer;
customer.CustomerNo = ++CustomerCount; //生成顾客编号
customer.ArrivalTime = time; //记录到达时间
//随机生成服务时间(5~10分钟)
customer.ServiceTime = rand() % MAX_SERVICE_TIME + 1;
return customer;
}
//顾客服务函数
void CustomerService(Queue* queuePtr, int time) {
if(queuePtr->Front == queuePtr->Rear) {
return ;
}
else{
//记录顾客实际等待时间
queuePtr->array[ queuePtr->Front ].WaitingTime = time - queuePtr->array[ queuePtr->Front ].ArrivalTime;
//记录此顾客的离开时间
queuePtr->array[ queuePtr->Front ].LeavingTime = time + queuePtr->array[queuePtr->Front].ServiceTime;
//从队首出队,此顾客已经服务完成
Dequeue(queuePtr);
}
}
//程序主函数
int main(void) {
int time, num, limit = 10;
srand((unsigned)time(NULL));
//初始化队列
queuePtr = InitQueue(MAX_QUEUE_SIZE);
//每一轮中生成顾客,并将其加入队列。
for(time=0; time<limit; time++) {
printf("Time: %d\n", time);
//随机生成顾客到达时间
if(rand()%2 == 0) {
Customer customer = GenerateCustomer(time);
Enqueue(queuePtr, customer);
printf("Enter customer: No.%d, Arrival Time: %d, Service Time: %d\n",
customer.CustomerNo, customer.ArrivalTime, customer.ServiceTime);
}
//处理队列中可能存在的顾客,更新离开时间等信息
CustomerService(queuePtr, time);
}
//输出每位顾客的服务时间和等待时间
for(num=0; num<CustomerCount; num++) {
printf("No.%d, Waiting Time: %d, Service Time: %d, Leaving Time: %d\n",
queuePtr->array[num].CustomerNo, queuePtr->array[num].WaitingTime,
queuePtr->array[num].ServiceTime, queuePtr->array[num].LeavingTime);
}
//释放队列空间
free(queuePtr->arrPtr);
free(queuePtr);
return 0;
}
代码演示的功能为:根据 limit
的设置(本例设为 10),生成 0~9 轮的随机顾客,并处理队列中可能存在的顾客。最后输出每位顾客的服务时间和等待时间等信息。
代码编译后的执行结果示例:
Time: 0
Enter customer: No.1, Arrival Time: 0, Service Time: 9
Time: 1
Time: 2
Time: 3
Time: 4
Time: 5
No.1, Waiting Time: 0, Service Time: 9, Leaving Time: 14
Time: 6
Time: 7
Time: 8
Time: 9
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构实现银行模拟 - Python技术站