typedef struct {
int front[2];
int rear[2];
int* arr[2][20001];
int noAnimal[2];
} AnimalShelf;
AnimalShelf* animalShelfCreate() {
AnimalShelf* obj=(AnimalShelf*)calloc(sizeof(AnimalShelf),1);
obj->noAnimal[0]=-1;
obj->noAnimal[1]=-1;
return obj;
}
void animalShelfEnqueue(AnimalShelf* obj, int* animal, int animalSize) {
obj->arr[animal[1]][obj->rear[animal[1]]++]=animal;
}
int* animalShelfDequeueAny(AnimalShelf* obj, int* retSize) {
*retSize=2;
if(obj->front[0]!=obj->rear[0] && obj->front[1]!=obj->rear[1]){
if(obj->arr[0][obj->front[0]][0] < obj->arr[1][obj->front[1]][0])
return obj->arr[0][obj->front[0]++];
else
return obj->arr[1][obj->front[1]++];
}
else if(obj->front[0]!=obj->rear[0]){
return obj->arr[0][obj->front[0]++];
}
else if(obj->front[1]!=obj->rear[1]){
return obj->arr[1][obj->front[1]++];
}
else
return obj->noAnimal;
}
int* animalShelfDequeueDog(AnimalShelf* obj, int* retSize) {
*retSize=2;
return (obj->front[1]!=obj->rear[1])?obj->arr[1][obj->front[1]++] :obj->noAnimal;
}
int* animalShelfDequeueCat(AnimalShelf* obj, int* retSize) {
*retSize=2;
return (obj->front[0]!=obj->rear[0])?obj->arr[0][obj->front[0]++] :obj->noAnimal;
}
void animalShelfFree(AnimalShelf* obj) {
free(obj);
}