//#include "pch.h"
//#include "pch.h"
#include <iostream>
#include <stdio.h>

#define MAXSIZE 1000
#define OVERFLOW -2
#define OK 1
#define ERROR -1

using namespace std;

typedef int Status;
typedef int Elempyte;
typedef struct {
    Elempyte *base;
    int front; //队列的头
    int rear; //队列里第一个为空的下标
}SqQueue;

Status InitQueue(SqQueue &Q) //初始化一个队列
{
    Q.base = new Elempyte[MAXSIZE]; //开辟头结点
    if (!Q.base) //注意如果开辟失败
        return OVERFLOW;
    Q.front = 0;   //此时是一个空表,所以表头和第一个为空的下标都相等 == 0;
    Q.rear = 0;
    return OK;
}
bool Empty(SqQueue Q) //判断是否为空 、bool类型
{
    if (Q.front == Q.rear) //当表头和第一个为空的下标相等时就说明为空队
        return true;
    else
        return false;
}

int GetQueueElem(SqQueue &Q, Elempyte &e) //出队,
{
    if (Empty(Q)) //可能是空表
        return ERROR;
    e = Q.base[Q.front];   //用e把对头的元素取出来,然后表头++
    Q.front = (Q.front + 1) % MAXSIZE; //注意在队列里面所有的++操作都需要取余MAXSIZE
    return OK;
}



void Print(int *arr, int n)
{
    cout << arr[0];
    for (int i = 1; i < n; i++)
        cout << " " << arr[i];
}

int main()
{
    SqQueue A; //偶数队列
    SqQueue B;//奇数队列
    InitQueue(A); //初始化两个队列
    InitQueue(B);
    int N; //输入当前的需要办理业务的人数
    Elempyte tmp;
    int i = 0;
    cin >> N;
    Elempyte data;//顾客的编号 每一个顾客都有自己的编号
    int result[N]; //(成功办理业务的顾客的顺序,讲已经办好业务的顾客按照顺序存到这个数组里面)开辟个N个顾客的数组,用来记录总的有几个人还他的编号
    for (int i = 0; i < N; i++)
    {
        cin >> data;
        if (data % 2 != 0)  //判断当前顾客的编号是什么?为偶数,存到A队列里面,
                              //为奇数存到B队列里面
        {
            if ((A.rear + 1) % MAXSIZE == A.front) //假满,即插入一个后rear+1 = frond
            {
                return ERROR; //队满
            }
            A.base[A.rear] = data; //第一个为空的位置插入这时候的顾客的编号
            A.rear = (A.rear + 1) % MAXSIZE; //第一个为空的元素+1取余
        }
        else
        {
            if ((B.rear + 1) % MAXSIZE == B.front)
            {
                return ERROR; //队满
            }
            B.base[B.rear] = data;
            B.rear = (B.rear + 1) % MAXSIZE;
        }
    }
    while (!Empty(A) && !Empty(A)) //将AB队列里面的元素以此出队,存到结果的顾客完成办理的结果数组里面,
    {
        GetQueueElem(A, tmp);  //用tmp带回表头元素
        result[i++] = tmp;
        GetQueueElem(A, tmp);
        result[i++] = tmp;
        GetQueueElem(B, tmp);
        result[i++] = tmp;
    }
    while (!Empty(A)) //B为空
    {
        GetQueueElem(A, tmp);
        result[i++] = tmp;
    }
    while (!Empty(B)) //A为空
    {
        GetQueueElem(B, tmp);
        result[i++] = tmp;
    }
    Print(result, N); //输出
}
7-3 银行业务队列简单模拟 (25 分)

设某银行有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