C语言数据结构实现银行模拟

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:概括流程

  1. 定义一个等待队列 queuePtr;
  2. 生成顾客并将其入队,同时在每一轮中进行模拟服务;
  3. 记录队列中每一位顾客的等待时间和离开时间。

示例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技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java深入了解数据结构之栈与队列的详解

    Java深入了解数据结构之栈与队列的详解 1. 栈的概念 栈(Stack)是一种先进后出的数据结构,类似于一个箱子,新的物品只能放到箱子的顶部,旧的物品只能从箱子的顶部取出。栈通常有下面几个基本操作: push:将元素压入栈中,放在栈顶。 pop:将栈顶元素弹出,如果栈为空,则抛出异常。 peek:返回栈顶元素,但不将其弹出,如果栈为空,则抛出异常。 isE…

    数据结构 2023年5月17日
    00
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 链表介绍 链表是一种数据结构,它对于存储数据是动态而灵活的。它可以根据我们的需要动态的分配内存空间。链表是由先后相连的数据单元(结点)组成,每个结点都包含了下一结点的地址信息,最后一个结点的地址信息为NULL。链表按照操作方式可以分为单向链表、双向链表与循环链表等几种类型。 归并排序原理 归并排序是一种分治思想的算法,…

    数据结构 2023年5月16日
    00
  • JavaScript中的Map数据结构详解

    JavaScript中的Map数据结构详解 什么是Map数据结构 Map是JavaScript中一种新的数据结构,类似于对象,但是比对象更加灵活。Map可以将任意类型的值作为键名(包括对象、字符串、数字、布尔值等),并且不会将键名强制转换为字符串。Map的键值对个数没有限制,可以根据需要动态地增加或者删除键值对。Map内部实现了一个哈希表,因此增加、删除、查…

    数据结构 2023年5月17日
    00
  • 柏林噪声算法(Perlin Noise)

    概述 引述维基百科的介绍: Perlin噪声(Perlin noise,又称为柏林噪声)指由Ken Perlin发明的自然噪声生成算法,具有在函数上的连续性,并可在多次调用时给出一致的数值。 在电子游戏领域中可以透过使用Perlin噪声生成具连续性的地形;或是在艺术领域中使用Perlin噪声生成图样。 维基百科的介绍相当的官方,其实可以理解为一个随机函数,不…

    算法与数据结构 2023年4月17日
    00
  • java编程队列数据结构代码示例

    下面是“Java编程队列数据结构代码示例”的完整攻略。 什么是队列 队列是一种有序的数据结构,特点是先进先出(FIFO)。队列中不管是插入操作还是删除操作,都是在队列的两端进行的,插入操作在队列的尾部进行,删除操作在队列的头部进行。队列的一个重要用途是在计算机的操作系统中,实现进程和所有需要等待资源的实体之间的交互。 队列的实现 队列数据结构可以采用数组或链…

    数据结构 2023年5月17日
    00
  • Java数据结构之List的使用总结

    非常感谢您对本网站的关注。Java数据结构之List的使用总结是一个非常重要的主题,这里将为您详细介绍。 1. List是什么 在Java中,List是一种非常实用的数据结构,它代表了一个元素的有序集合,其中的每个元素都可以用一个整数索引来标识。List允许多个元素重复,同时还可以在集合的任意位置插入或者删除元素。 Java中的List主要分为两类:Arra…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之排序总结(一)

    好的!首先感谢你对我的提问,我将会在这里详细讲解“C语言数据结构与算法之排序总结(一)”的完整攻略。 概述 本文是关于 C 语言数据结构与算法中排序总结(一)的攻略说明。主要包括目录、排序算法、排序分析和示例演示等内容,让读者能够了解排序算法的基本思想、常见的分类和应用场景,以及不同排序算法的优缺点,进而选择适合的排序算法。 目录 基本概念 冒泡排序 插入排…

    数据结构 2023年5月17日
    00
  • EMI/EMS/EMC有什么关系?

    EMI(Electromagnetic Interference)直译是“电磁干扰”,是指电子设备(即干扰源)通过电磁波对其他电子设备产生干扰的现象。 从“攻击”方式上看,EMI主要有两种类型:传导干扰和辐射干扰。 电磁传导干扰是指干扰源通过导电介质(例如电线)把自身电网络上的信号耦合到另一个电网络。 电磁辐射干扰往往被我们简称为电磁辐射,它是指干扰源通过空…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部