7-18银行业务队列简单模拟
完整题目
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
输入格式:
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出格式:
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入样例:
8 2 1 3 9 4 11 13 15
结尾无空行
输出样例:
1 3 2 9 11 4 13 15
结尾无空行
本题最简易的办法应该是使用三个数组,由于本人是数据结构初学者(也是计算机初学者TAT),借此练习了一下队列,所以代码较复杂。题中的队列就完全适配队列先进先出的特性。
具体思路
1.输入操作数个数n。设置一个数组来存放这n个操作数.
2.设置两个队列Q1,Q2,Q1存放n个操作数中的奇数,Q2存放偶数。
3.按照每输出两个奇数,就输出一个偶数的规律(关键点!)把这n个数从Q1 Q2中出队,将这重新排列后的n个数放入数组中(这里再使用队列略显繁琐,但完全可以使用队列实现),最后逐个输出。
4.注意结尾无空格!
完整代码实现:
1.定义队列
#include<iostream>
using namespace std;
int a[1000]; //全局变量hhh
typedef struct { //定义一个顺序栈
int data[1000]; //队列长度 注:题目中N<=1000
int front, rear; //头指针和尾指针!
}SqQueue;
SqQueue CreateQ() //队列初始化 这里其实可以在main函数中直接初始化 更为简洁。
{
SqQueue Q;
Q.rear = Q.front = 0;
return Q;
}
int main()
{
SqQueue Q1,Q2; //声明两个队列
int n; //操作数个数
cin >> n;
if (n > 1000 || n < 0) //0这个临界值的判断有或没有都可以
return 0; //return的用法!直接跳出函数!
int str[n]; //定义数组来放这n个数(这样每个数就有标号了)
for (int i = 0; i < n; i++)
{
cin >> str[i];
}
//这里是更简便的初始化 OvO
/* Q1.rear = Q1.front = 0;
Q2.rear = Q2.front = 0;*/
//用一个函数同时初始化两个队列
Q1 = CreateQ();
Q2 = CreateQ();
//把n个数放到两个队列里
for (int j = 0; j < n; j++)
{
if (str[j] % 2 == 0)//是偶数
{//插入队列2
Q2.data[Q2.rear] = str[j]; //两种情况,不好放在同一个函数里
Q2.rear = Q2.rear + 1;//rear指针指向即将要存入数的位置!
}
else
{//是奇数 插入队列1
Q1.data[Q1.rear] = str[j];
Q1.rear = Q1.rear + 1;
}
}
int s = 0;
while(Q1.rear > Q1.front || Q2.rear > Q2.front) //这里得是||!!!只要有一个就可以进行的操作!
{
if (Q1.rear > Q1.front)//是否有=? 没有!再次提醒!队尾指针指向接下来的元素该插入的位置!!!不是最后一个元素!!
{ //输出两个奇数
a[s] = Q1.data[Q1.front];
s++;
Q1.front = Q1.front + 1;
a[s] = Q1.data[Q1.front];
s++;
Q1.front = Q1.front + 1;
}
if (Q2.rear > Q2.front)
{ //输出一个偶数
a[s] = Q2.data[Q2.front];
s++;
Q2.front = Q2.front + 1;
}
}
for (int x = 0; x < n; x++) //这里s,n都可以!
{
if (x == n - 1) //消除最后一个空格!
{
cout << a[x];
return 0; //这句可不能丢啊!不然会输出两个最后一个数
}
cout << a[x] << " ";
}
//怎么改每个测试点都是答案错误的时候看看是不是括号错了呜呜呜
return 0;
}
我的一些问题
下面是我本人在做本题时遇到的一些问题(比较基础QAQ)
1.如何存放这n个操作数才便于读取?
使用数组!数组有下标!还有定义数组注意格式!
2.如何判断奇数和偶数
除以(模)二取余看是不是等于零TAT(a%2 == 0)。
3.总结
(1)rear指针指向即将要存入数的位置!
(2)消除最后一个数后面的空格的时候一定要有一个return或者循环里的break,要不会输出两个最后一个数。
(3)单链表适用的Q1 = CreateQ( );这种写法是可行的!是通用的,只是队列不太有必要用,单链表里用它来创建多个链表更简便一些!
(4)怎么改每个测试点都是答案错误的时候看看是不是括号错了呜呜呜…
(5)return的用法!直接跳出函数!
(6)注意题目里面给的队列长度!如本题的1000
(7)语句必须在函数体内执行,函数体外只能进行初始化
(8)复习了一下:
局部变量(Local Variable):定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。
全局变量(Global Variable):定义:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。
完结撒花!
2020.10.2
21:23