//#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
浙公网安备 33010602011771号