# 一、分析
## 1.1 项目内容
设某银行有 A,B 两个业务窗口,且处理业务的速度不一样,其中 A 窗口处理速度是 B 窗口的 2 倍----即当 A 窗口每处理完 2 个顾客是,B 窗口处理完 1 个顾客。给定到达银行的顾客序列,请按照业务完成的顺序输出顾客序列。假定不考虑顾客信后到达的时间间隔,并且当不同窗口同时处理完 2 个顾客时,A 窗口的顾客优先输出。
## 1.2 功能要求
输入说明:输入为一行正整数,其中第一数字 N(N<=1000)为顾客总数,后面跟着 N 位顾客的编号。编号为奇数的顾客需要到 A 窗口办理业务,为偶数的顾客则去 B 窗口。数字间以空格分隔。
输出说明:按照业务处理完成的顺序输出顾客的编号。数字键以空格分隔,但是最后一个编号不能有多余的空格。
测试用例:
| 序号 | 输入 | 输出 | 说明 |
| ---- | -------------------- | ------------------ | -------------------- |
| 1 | 8 2 1 3 9 4 11 13 15 | 1 3 2 9 11 4 13 15 | 正常测试,A 窗口人多 |
| 2 | 8 2 1 3 9 4 11 12 16 | 1 3 2 9 11 4 12 16 | 正常测试,B 窗口人多 |
| 3 | 1 6 | 6 | 最小 N |
# 二、设计与实现
## 2.1 Node 类设计与实现
Node 类为 LinkedList 的基础节点,是一个模板类。它能够存储一个 T 类型的值以及一个指向下一 Node 节点的 next 成员变量。
```c++
template <class T> class Node
{
public:
Node(const T & value, Node<T> *next= nullptr) : value(value), next(next) {}
Node(Node<T> *next= nullptr) : next(next) {}
T value;
Node<T> *next;
};
```
## 2.2 LinkedList 类设计与实现
模板类,有两个 Node 类型的成员变量 first 以及 last,分别指向链表头和末尾。这个类当作一个队列,其中有 enqueue(),dequeue(),empty()函数。
empty():只要简单的判断 first 是否为空即可简单的判断队列是否为空。
```c++
enqueue():因为是队列,所以这个函数负责将数据加入链表的末尾。添加的过程是:如果头尾指针都为空的话,就让头尾指针指向这个元素,否则就在尾指针之后添加这个元素,并且让尾指针指向它。(而且如果first->next为空,得让它指向last,不这样的话first只是一个单独的节点,和后续节点没有产生联系)。
```
dequeue():如果队列为空,返回。否则返回队列头元素(first 的元素),并且让 first 指向它的下一个元素,如果 first 为空则也让 last 为空。
```c++
template<class T>class LinkedList
{
public:
LinkedList():first(nullptr),last(nullptr)
{
}
bool empty()
{
return first == nullptr;
}
void enqueue(T t)
{
if(first== nullptr && last== nullptr)
{
first = new Node<T>(t, nullptr);
last = new Node<T>(t, nullptr);
}
else
{
Node<T> *temp = new Node<T>(t, nullptr);
last->next = temp;
last=last->next;
if(first->next== nullptr)
{
first->next = last;
}
}
}
T dequeue()
{
if (first == nullptr)
{
return nullptr;
}
T t = first->value;
first = first->next;
if(first== nullptr)
{
last = nullptr;
}
return t;
}
Node<T> * first;
Node<T> * last;
};
```
## 2.3 主函数设计与实现
首先,先用一个数组存储用户输入的 N 个正整数,并且创建两个 LinkedList 链表队列,代表了 A,B 两个柜台。然后,根据编号为奇数还是偶数让他们分别进入两个队列(即代表了他们在 A,B 两个柜台上排队)。
然后进入循环,循环中,如果队列 A 不为空,则打印此队列的头节点,并且让头节点指向下一个节点,重复一次,判断 A 队列是否为空,不为空则打印当前的子节点。接着判断 B 队列是否为空,不为空打印它的头节点,并且让他指向他的下一个节点。(其实这就是在模拟题目中的情形:当 A 窗口每处理完 2 个顾客是,B 窗口处理完 1 个顾客。并且当不同窗口同时处理完 2 个顾客时,A 窗口的顾客优先输出。)然后继续进入循环判断条件,如果两个队列都为空则退出循环,否则继续循环。值得注意的是,如果其中一个队列为空的话,那么就会把另一个队列的所有元素都输出了。
```c++
int main()
{
cout << "Please Enter the total number of customers N, and the number of N customers:";
int N;
cin >> N;
vector<int> customers;
LinkedList<int> listA, listB;
for (int i = 0; i < N; ++i)
{
int customer;
cin >> customer;
customers.push_back(customer);
}
for (int i = 0; i <N ; ++i)
{
if(customers[i]%2==1)//去1
{
listA.enqueue(customers[i]);
}
else
{
listB.enqueue(customers[i]);
}
}
while(!listA.empty() || !listB.empty())
{
if(!listA.empty())
{
cout << listA.first->value<<" ";
listA.first = listA.first->next;
}
if(!listA.empty())
{
cout << listA.first->value<<" ";
listA.first = listA.first->next;
}
if(!listB.empty())
{
cout << listB.first->value<<" ";
listB.first = listB.first->next;
}
}
return 0;
}
```
# 三、测试
## 3.1 功能测试
### 3.1.1 测试 1
![](https://www.writebug.com/myres/static/uploads/2021/12/1/79db533df61a3973b0886e280762c3f8.writebug)
### 3.1.2 测试 2
![](https://www.writebug.com/myres/static/uploads/2021/12/1/883305a8c0cf0e8f5612a56c19488f68.writebug)
### 3.1.3 测试 3
![](https://www.writebug.com/myres/static/uploads/2021/12/1/c95ce0449d2e4bf66ae951b3f017e151.writebug)
### 3.1.4 测试 4
![](https://www.writebug.com/myres/static/uploads/2021/12/1/87342930bfe7bda330e43c49c509eea0.writebug)
### 3.1.5 测试 5
![](https://www.writebug.com/myres/static/uploads/2021/12/1/981402063011ae13f236ec6e0d0fafbc.writebug)
### 3.1.6 测试 6
![](https://www.writebug.com/myres/static/uploads/2021/12/1/36b9744dbddd6af06815eb05f059d424.writebug)
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++模拟(控制台)银行业务【100012675】
共6个文件
h:2个
txt:1个
cpp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 167 浏览量
2023-06-07
14:08:18
上传
评论
收藏 5KB ZIP 举报
温馨提示
设某银行有 A,B 两个业务窗口,且处理业务的速度不一样,其中 A 窗口处理速度是 B 窗口的 2 倍----即当 A 窗口每处理完 2 个顾客是,B 窗口处理完 1 个顾客。给定到达银行的顾客序列,请按照业务完成的顺序输出顾客序列。假定不考虑顾客信后到达的时间间隔,并且当不同窗口同时处理完 2 个顾客时,A 窗口的顾客优先输出。 输入说明:输入为一行正整数,其中第一数字 N(N<=1000)为顾客总数,后面跟着 N 位顾客的编号。编号为奇数的顾客需要到 A 窗口办理业务,为偶数的顾客则去 B 窗口。数字间以空格分隔。 输出说明:按照业务处理完成的顺序输出顾客的编号。数字键以空格分隔,但是最后一个编号不能有多余的空格。
资源推荐
资源详情
资源评论
收起资源包目录
100012675-基于C++模拟(控制台)银行业务.zip (6个子文件)
bank
Bank
input.txt 77B
LinkedList.h 990B
Node.h 259B
Test.cpp 1KB
LICENSE 1KB
README.md 6KB
共 6 条
- 1
资源评论
神仙别闹
- 粉丝: 3797
- 资源: 7471
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功