# 一、分析
## 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)
神仙别闹
- 粉丝: 4185
- 资源: 7485
最新资源
- (175586626)数字图像处理复习资料.docx
- 24WDC-DC矿用本质安全型电源的设计本安电源开关电源 基于反激变器的矿用本质安全性电源,输出端设有两级保护,符合最小燃点要求,有过压过流保护功能 包括:设计说明书,电路原理图A3图纸,仿真文件
- python入门的建议和资源.zip
- (175737404)java实现简单坦克大战
- (175964398)希尔伯特黄变换matlab程序
- 基于java+springboot+mysql+微信小程序的刷题系统 源码+数据库+论文(高分毕业设计)t.zip
- (176132802)51单片机学习代码-普中51单片机.zip
- 基于java+springboot+mysql+微信小程序的青少年科普教学系统平台 源码+数据库+论文(高分毕业设计).zip
- 基于java+springboot+mysql+微信小程序的社区车位租赁系统 源码+数据库+论文(高分毕业设计).zip
- (176420008)电赛-数控直流稳压电源proteus仿真+程序资料.rar
- PCIe No Snoop及TPH/DDIO技术解析与优化
- (176445450)基于Spring Boot+Vue 3+Element-Plus+Vue-Router+Pinia+Vant的电商管理系统源码
- 三菱FX3U与2台台达温控器modbus通讯案例 功能:三菱FX3U与2台台达温控器进行modbus通讯 实现设定温度,设定温度探头型号,读取实际温度 配件:三菱FX3U的PLC,FX3U的485
- 基于java+springboot+mysql+微信小程序的微信平台签到系统 源码+数据库+论文(高分毕业设计).zip
- 基于java+springboot+mysql+微信小程序的网络安全科普系统 源码+数据库+论文(高分毕业设计).rar
- 基于java+springboot+mysql+微信小程序的水果销售系统 源码+数据库+论文(高分毕业设计).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈