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日

相关文章

  • C语言数据结构系列之树的概念结构和常见表示方法

    C语言数据结构系列之树的概念结构和常见表示方法 树是一种非线性数据结构,它由若干个节点构成,节点之间通过边来连接,具有层次关系。 树的基本概念和术语 节点:树中的元素,它可以包含一个数据元素或多个数据元素,一个节点也可以称为一个分支节点。 根节点:树的最上层节点,它没有父节点。 叶子节点:没有子节点的节点称为叶子节点。 父节点和子节点:父节点是某个节点的上一…

    数据结构 2023年5月17日
    00
  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

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

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

    数据结构 2023年5月17日
    00
  • mosn基于延迟负载均衡算法 — 走得更快,期待走得更稳

    前言 这篇文章主要是介绍mosn在v1.5.0中新引入的基于延迟的负载均衡算法。 对分布式系统中延迟出现的原因进行剖析 介绍mosn都通过哪些方法来降低延迟 构建来与生产环境性能分布相近的测试用例来对算法进行验证 地址:https://github.com/mosn/mosn/pull/2253 在开始聊基于延迟的负载均衡算法之前,先介绍下什么是负载均衡——…

    算法与数据结构 2023年5月8日
    00
  • C语言数据结构之栈和队列的实现及应用

    C语言数据结构之栈和队列的实现及应用 什么是栈和队列? 栈是一种具有后进先出(LIFO)特性的线性数据结构,可以理解为一个只能在一端进行插入和删除操作的数据结构。通常称插入元素的一端为栈顶,删除元素的一端为栈底。 队列是一种具有先进先出(FIFO)特性的线性数据结构,可以理解为一个只能在两端进行插入和删除操作的数据结构。一端进行插入操作,称之为队尾,一端进行…

    数据结构 2023年5月17日
    00
  • MySQL索引结构详细解析

    MySQL索引结构是MySQL数据库中非常重要的一部分,它能够显著提升数据库查询效率。本文将详细解析MySQL索引结构,包括索引的基本概念、常见的索引类型、索引的创建、索引的使用和索引的优化等方面。 索引的基本概念 索引是一种数据结构,它可以加速数据库中的查询操作。索引一般是在表中一个或多个列上创建的,这些列的值被按照一定的规则存储在索引中。当查询时,可以通…

    数据结构 2023年5月17日
    00
  • C语言线性表的链式表示及实现详解

    C语言线性表的链式表示及实现详解 什么是线性表 线性表是一种在计算机科学中常见的数据结构,它由一组连接在一起的元素组成,每个元素都包含前后指针以指向相邻的元素,从而构成一个连续的线性序列。线性表可以用来存储和处理一般数据集合。 链式存储结构 线性表的链式存储结构是由若干个结构体组成的链表,每个结构体都称为一个节点。每个节点包含两个字段:一个数据域用来存放数据…

    数据结构 2023年5月17日
    00
  • MySQL数据库体系架构详情

    MySQL数据库体系架构是MySQL数据库自身的发展和演变过程中逐渐形成的一个庞大的体系。这个体系由多个组件构成,包括连接器、查询缓存、解析器、优化器、执行器、存储引擎等多个部分,其中存储引擎是其中最具有代表性的组件之一。在这篇攻略中,我们将详细讲解MySQL数据库体系架构的各个部分,介绍它们各自的功能和作用。 连接器 MySQL的连接器负责与客户端建立连接…

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