**
7-4 银行业务队列简单模拟 (15 分)
**
设某银行有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
//结尾无空行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum { push, pop, end } Operation;
typedef enum { false, true } bool;
typedef int ElementType;
typedef int QElemType;
typedef int Position;
typedef int Status;
typedef struct QNode{//队列
QElemType *Data;
int front; //头指针,若队列不空,指向队列头元素
int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置
int MaxSize;
} Queue,*QStack;
QStack QCreateStack(int MaxSize){//创建队列
QStack S = (QStack)malloc(sizeof(Queue));
S->Data = (QElemType *)malloc(MaxSize * sizeof(QElemType));
S->front=S->rear=0;
S->MaxSize = MaxSize;
return S;
}
void QPush( QStack S, QElemType x){//入队列
S->rear++;
S->Data[S->rear]=x;
}
QElemType QPop(QStack S){//出队列
int a;
if(S->rear!=S->front){
S->front++;
return S->Data[S->front];
}
else
return 0;
}
void cha(QStack S1,QStack S2,int a){
int i,j=0;
while(S1->rear!=S1->front||S2->rear!=S2->front){
for(i=0;i<2;i++){
if(S2->rear!=S2->front){
printf("%d",QPop(S2));
j++;
if(j!=a){
printf(" ");
}
}
}
if(S1->rear!=S1->front){
printf("%d",QPop(S1));
j++;
if(j!=a){
printf(" ");
}
}
}
}
int main(){
QStack S1,S2;
int a,i;
scanf("%d",&a);
int b[a];
//建立队列
S1=QCreateStack(a);//偶数
S2=QCreateStack(a);//奇数
//入队列
for(i=0;i<a;i++){
scanf("%d",&b[i]);
if(b[i]%2==0){
//printf("%d!",b[i]);
QPush(S1, b[i]);
}
else
QPush(S2, b[i]);
}
cha(S1,S2,a);
return 0;
}