7-18 银行业务队列简单模拟

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

上一篇:EOJ1224 简单迷宫问题


下一篇:一步一步学习.NET Core 介绍篇 01