写C语言,用链表表示队列,有新窗口先去新窗口服务,客户哪个队列先结束了服务,就去服务新的下一个客户,有四个服务窗口有取款、存款、还贷、挂失一共四个服务类型,取款服务时间为8、存款服务时间为12、还贷服务时间为15、挂失服务时间为10,一共四个服务类型,用序号表示服务类型,客户选择服务类型,文件读取客户排队序号、到达的时间、需要服务的类型,在营业时间段,逗留时间等于客户到达时间加服务时间,计算客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。
时间: 2024-04-14 15:30:39 浏览: 55
这是一个将银行服务窗口与队列结合的问题,我可以为您提供一个基本C语言实现。以下是一个例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义客户结构体
typedef struct Customer {
int arrivalTime; // 到达时间
int serviceType; // 服务类型
int serviceTime; // 服务时间
struct Customer* next; // 下一个客户
} Customer;
// 定义队列结构体
typedef struct Queue {
Customer* front; // 队列首部
Customer* rear; // 队列尾部
} Queue;
// 初始化队列
void initQueue(Queue* queue) {
queue->front = queue->rear = NULL;
}
// 判断队列是否为空
int isQueueEmpty(Queue* queue) {
return queue->front == NULL;
}
// 入队
void enqueue(Queue* queue, int arrivalTime, int serviceType, int serviceTime) {
Customer* newCustomer = (Customer*)malloc(sizeof(Customer));
newCustomer->arrivalTime = arrivalTime;
newCustomer->serviceType = serviceType;
newCustomer->serviceTime = serviceTime;
newCustomer->next = NULL;
if (isQueueEmpty(queue)) {
queue->front = queue->rear = newCustomer;
} else {
queue->rear->next = newCustomer;
queue->rear = newCustomer;
}
}
// 出队
int dequeue(Queue* queue) {
if (isQueueEmpty(queue)) {
printf("队列为空");
return -1;
}
int arrivalTime = queue->front->arrivalTime;
Customer* temp = queue->front;
queue->front = queue->front->next;
free(temp);
if (queue->front == NULL) {
queue->rear = NULL;
}
return arrivalTime;
}
// 计算平均逗留时间和办理数量
void calculateStats(Queue* queue, int windowCounts[], int serviceCounts[]) {
int totalWaitingTime = 0;
int totalCustomers = 0;
while (!isQueueEmpty(queue)) {
int arrivalTime = dequeue(queue);
int serviceType = queue->front->serviceType;
int serviceTime = queue->front->serviceTime;
totalWaitingTime += arrivalTime;
totalCustomers++;
windowCounts[serviceType]++;
serviceCounts[serviceType]++;
// 更新队列
queue->front->arrivalTime += serviceTime;
}
float averageWaitingTime = (float)totalWaitingTime / totalCustomers;
printf("平均逗留时间: %.2f\n", averageWaitingTime);
for (int i = 0; i < 4; i++) {
printf("窗口%d办理客户数: %d\n", i+1, windowCounts[i]);
printf("窗口%d办理业务数: %d\n", i+1, serviceCounts[i]);
}
}
int main() {
Queue queue;
initQueue(&queue);
int windowCounts[4] = {0}; // 记录每个窗口办理的客户数
int serviceCounts[4] = {0}; // 记录每种业务办理的数量
FILE* file = fopen("customer.txt", "r");
if (file == NULL) {
printf("无法打开文件");
return 1;
}
int arrivalTime, serviceType, serviceTime;
while (fscanf(file, "%d %d %d", &arrivalTime, &serviceType, &serviceTime) == 3) {
enqueue(&queue, arrivalTime, serviceType, serviceTime);
}
fclose(file);
calculateStats(&queue, windowCounts, serviceCounts);
return 0;
}
```
请注意,此示例假设您已经创建了一个名为`customer.txt`的文本文件,并且文件格式为每行包含三个整数,分别表示到达时间、服务类型和服务时间。
这段代码将根据文件中的数据创建一个队列,模拟银行的服务过程,并计算平均逗留时间以及每个窗口办理的客户数和每种业务办理的数量。您可以根据实际需求进行调整和扩展。
阅读全文