news 2026/6/11 20:25:37

用C语言手搓一个银行排队模拟器(PTA数据结构7-2题保姆级解析)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用C语言手搓一个银行排队模拟器(PTA数据结构7-2题保姆级解析)

从零实现银行排队模拟器:用C语言玩转队列数据结构

银行大厅里此起彼伏的叫号声,窗口前井然有序的队伍——这些日常场景背后隐藏着计算机科学中一个基础而重要的数据结构:队列。本文将带你用C语言打造一个完整的银行排队模拟器,不仅解决PTA题目,更深入理解队列在实际系统中的应用。

1. 项目规划与设计思路

在开始编码前,我们需要明确模拟器的核心功能和架构。银行排队系统的本质是多个服务窗口以不同速率处理顾客请求,这正是队列"先进先出"特性的典型应用场景。

系统基本规则:

  • A窗口处理速度是B窗口的2倍(A每处理2人,B处理1人)
  • 奇数编号顾客前往A窗口,偶数编号前往B窗口
  • 同时完成时A窗口顾客优先输出
  • 不考虑顾客到达的时间间隔

为什么选择数组实现队列?对于这个规模的题目,数组足够高效且实现简单。后续我们可以探讨链表实现的优化空间。

2. 核心数据结构实现

我们先构建最基础的队列结构。虽然可以直接操作数组,但封装成队列结构能让代码更清晰。

#define MAX_SIZE 1000 typedef struct { int data[MAX_SIZE]; int front; // 队首指针 int rear; // 队尾指针 } Queue; void initQueue(Queue *q) { q->front = 0; q->rear = 0; } int isFull(Queue *q) { return (q->rear + 1) % MAX_SIZE == q->front; } int isEmpty(Queue *q) { return q->front == q->rear; } void enqueue(Queue *q, int item) { if (!isFull(q)) { q->data[q->rear] = item; q->rear = (q->rear + 1) % MAX_SIZE; } } int dequeue(Queue *q) { if (!isEmpty(q)) { int item = q->data[q->front]; q->front = (q->front + 1) % MAX_SIZE; return item; } return -1; // 表示队列为空 }

3. 业务逻辑实现

有了队列结构,我们来实现银行的具体业务逻辑。注意处理不同窗口的处理速度差异和输出顺序规则。

void simulateBankService(Queue *qA, Queue *qB, int output[], int *outputIndex) { int count = 0; while (!isEmpty(qA) || !isEmpty(qB)) { count++; // A窗口处理规则 if (!isEmpty(qA) && (count % 3 != 0 || isEmpty(qB))) { output[(*outputIndex)++] = dequeue(qA); } // B窗口处理规则 else if (!isEmpty(qB)) { output[(*outputIndex)++] = dequeue(qB); } } }

提示:这里的count计数器是关键,它决定了何时该从B窗口出队。每3次循环中,第3次从B出队,其余从A出队。

4. 完整系统实现与交互

现在我们将所有部分组合起来,创建一个完整的、可交互的模拟器。

#include <stdio.h> #include <stdlib.h> #include <time.h> // 前面定义的Queue结构和函数... int main() { Queue qA, qB; initQueue(&qA); initQueue(&qB); int N; printf("请输入顾客数量: "); scanf("%d", &N); printf("请输入%d个顾客编号(空格分隔): ", N); for (int i = 0; i < N; i++) { int num; scanf("%d", &num); if (num % 2 != 0) { enqueue(&qA, num); } else { enqueue(&qB, num); } } int output[MAX_SIZE]; int outputIndex = 0; simulateBankService(&qA, &qB, output, &outputIndex); printf("\n业务处理顺序: "); for (int i = 0; i < outputIndex; i++) { printf("%d", output[i]); if (i != outputIndex - 1) { printf(" "); } } printf("\n"); return 0; }

可视化增强技巧:

  • 添加system("clear")system("cls")清屏
  • 使用usleepSleep函数控制输出节奏
  • 添加颜色区分不同窗口的输出

5. 测试与调试策略

确保模拟器正确性的关键在于全面的测试用例设计。考虑以下测试场景:

测试类型输入样例预期输出验证点
常规情况8 2 1 3 9 4 11 13 151 3 2 9 11 4 13 15基本规则验证
只有A窗口5 1 3 5 7 91 3 5 7 9单一队列处理
只有B窗口4 2 4 6 82 4 6 8单一队列处理
交替极端3 1 2 31 3 2边界条件验证

调试时可以添加打印语句观察队列状态:

void printQueue(Queue *q, const char *name) { printf("%s队列: [", name); for (int i = q->front; i != q->rear; i = (i + 1) % MAX_SIZE) { printf("%d ", q->data[i]); } printf("]\n"); }

6. 性能优化与扩展思路

虽然当前实现已经满足题目要求,但我们可以考虑更多优化和扩展方向:

内存优化:

  • 使用动态数组替代固定大小数组
  • 实现循环队列避免空间浪费

功能扩展:

  1. 添加顾客到达时间间隔模拟
  2. 实现可视化界面(使用ncurses库)
  3. 支持多窗口配置(3个或更多窗口)
  4. 添加服务时间统计功能
// 扩展的顾客结构体 typedef struct { int id; int arrivalTime; int serviceTime; } Customer; // 多窗口配置示例 typedef struct { Queue *queues; int count; int *serviceRates; // 各窗口服务速率 } WindowConfig;

7. 教学价值与实际应用

这个项目虽然简单,但涵盖了数据结构学习的多个关键点:

  1. 队列的基本操作:入队、出队、判空、判满
  2. 多队列协同工作:处理不同速率的服务窗口
  3. 业务规则实现:将实际问题转化为程序逻辑
  4. 调试技巧:如何验证队列操作的正确性

在实际系统中,类似的队列管理应用于:

  • 操作系统进程调度
  • 网络数据包传输
  • 打印机任务管理
  • 客服中心呼叫分配

在实现银行模拟器的过程中,最容易被忽视的是队列指针的循环处理。记得测试队列满和空时的边界条件,这是面试中常见的考察点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 20:25:18

PKHeX自动合法性插件终极指南:如何快速创建合规宝可梦

PKHeX自动合法性插件终极指南&#xff1a;如何快速创建合规宝可梦 【免费下载链接】PKHeX-Plugins Plugins for PKHeX 项目地址: https://gitcode.com/gh_mirrors/pk/PKHeX-Plugins 在宝可梦数据管理中&#xff0c;合法性验证、自动修复和批量处理是每个训练师面临的三大…

作者头像 李华
网站建设 2026/6/11 20:23:55

RTL8157-CG、凭低功耗驾驭 5GbE 高速网络的以太网控制器

型号介绍RTL8157-CG 是 瑞昱&#xff08;Realtek&#xff09;推出的新一代高速USB转以太网控制芯片&#xff0c;主打低成本、低功耗、高性能的5G有线网络传输能力&#xff0c;是主流2.5G网口芯片的升级迭代产品&#xff0c;广泛适配消费级、便携设备及嵌入式终端的高速联网场景…

作者头像 李华
网站建设 2026/6/11 20:23:51

从入门到精通:主流服务器软件全景解析与实战选型指南

1. 服务器软件基础认知&#xff1a;从零开始理解核心概念 第一次接触服务器软件时&#xff0c;我被各种术语搞得晕头转向。后来在实际项目中才发现&#xff0c;理解这些基础概念就像学骑自行车——开始觉得难&#xff0c;一旦掌握就再也忘不掉。服务器软件本质上就是专门处理网…

作者头像 李华
网站建设 2026/6/11 20:18:51

2026年上海GEO优化公司全景梳理:从底层逻辑到落地坐标

GEO已经不再是少数技术团队的尝鲜试验。2026年的上海市场&#xff0c;大量企业正在把预算从传统SEO向大模型生成式引擎优化迁移&#xff0c;但迁移过程中的混乱远大于共识。不少人问上海GEO优化公司到底在做什么、各家之间有什么差别、选的时候应该看哪些维度&#xff0c;市场上…

作者头像 李华