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

#define MAX_CUSTOMERS 100

// 客户结构体
typedef struct {
    int id;         // 客户ID
    int arrivalTime; // 到达时间
    int serviceTime; // 服务时间
} Customer;

// 队列结构体（顺序存储）
typedef struct {
    Customer data[MAX_CUSTOMERS]; // 存储客户的数组
    int front;                    // 队头索引
    int rear;                     // 队尾索引
    int size;                     // 当前队列大小
} Queue;

// 初始化队列
void initQueue(Queue *q) {
    q->front = 0;
    q->rear = 0;
    q->size = 0;
}

// 判断队列是否为空
int isEmpty(Queue *q) {
    return q->size == 0;
}

// 判断队列是否已满
int isFull(Queue *q) {
    return q->size == MAX_CUSTOMERS;
}

// 入队
int enqueue(Queue *q, Customer customer) {
    if (isFull(q)) {
        printf("队列已满，无法加入更多客户！\n");
        return 0; // 失败
    }
    
    q->data[q->rear] = customer;
    q->rear = (q->rear + 1) % MAX_CUSTOMERS; // 循环队列处理
    q->size++;
    return 1; // 成功
}

// 出队
int dequeue(Queue *q, Customer *customer) {
    if (isEmpty(q)) {
        printf("队列已空！\n");
        return 0; // 失败
    }
    
    *customer = q->data[q->front];
    q->front = (q->front + 1) % MAX_CUSTOMERS; // 循环队列处理
    q->size--;
    return 1; // 成功
}

// 查看队头元素
int peek(Queue *q, Customer *customer) {
    if (isEmpty(q)) {
        printf("队列已空！\n");
        return 0; // 失败
    }
    
    *customer = q->data[q->front];
    return 1; // 成功
}

int main() {
    Queue bankQueue;
    initQueue(&bankQueue);
    
    // 定义并初始化客户数组
    Customer customers[] = {
        {1, 0, 5},  // 客户1在时间0到达，需要5分钟服务
        {2, 1, 3},  // 客户2在时间1到达，需要3分钟服务
        {3, 3, 8},  // 客户3在时间3到达，需要8分钟服务
        {4, 5, 6},  // 客户4在时间5到达，需要6分钟服务
        {5, 7, 2}   // 客户5在时间7到达，需要2分钟服务
    };
    
    int numCustomers = sizeof(customers) / sizeof(customers[0]);
    
    // 将所有客户加入队列
    for (int i = 0; i < numCustomers; i++) {
        enqueue(&bankQueue, customers[i]);
    }
    
    printf("===== 银行排队模拟系统 =====\n");
    int currentTime = 0;
    
    while (!isEmpty(&bankQueue)) {
        Customer current;
        dequeue(&bankQueue, &current);
        
        // 如果客户到达时间晚于当前时间，更新当前时间
        if (current.arrivalTime > currentTime) {
            currentTime = current.arrivalTime;
        }
        
        printf("时间 %d: 客户%d开始办理业务 (到达时间: %d, 服务时间: %d分钟)\n",
               currentTime, current.id, current.arrivalTime, current.serviceTime);
        
        // 更新当前时间为业务办理结束时间
        currentTime += current.serviceTime;
        
        printf("时间 %d: 客户%d业务办理完成\n", currentTime, current.id);
    }
    
    return 0;
}