An animal shelter holds only dogs and cats, and operates on a strictly "first in, first out" basis. People must adopt either the "oldest" (based on arrival time) of all animals at the shelter, or they can select whether they would prefer a dog or a cat (and will receive the oldest animal of that type). They cannot select which specific animal they would like. Create the data structures to maintain this system and implement operations such as enqueue, dequeueAny, dequeueDog and dequeueCat.
Example
int CAT = 0
int DOG = 1
enqueue("james", DOG);
enqueue("tom", DOG);
enqueue("mimi", CAT);
dequeueAny(); // should return "james"
dequeueCat(); // should return "mimi"
dequeueDog(); // should return "tom"
class Node {
int time;
String name;
Node(String name, int time) {
this.name = name;
this.time = time;
}
public String getName() {
return this.name;
}
public int getTime() {
return this.time;
}
}
public class AnimalShelter {
private static final int DOG = 1;
private static final int CAT = 0;
private int tot;
private LinkedList<Node> cats, dogs;
public AnimalShelter() {
// do initialize if necessary
tot = 0;
dogs = new LinkedList<Node>();
cats = new LinkedList<Node>();
}
/**
* @param name a string
* @param type an integer, 1 if Animal is dog or 0
* @return void
*/
void enqueue(String name, int type) {
tot += 1;
if (type == DOG) {
dogs.add(new Node(name, tot));
} else {
cats.add(new Node(name, tot));
}
}
public String dequeueAny() {
if (cats.isEmpty()) {
return dequeueDog();
} else if (dogs.isEmpty()) {
return dequeueCat();
} else {
int dogTime = dogs.getFirst().getTime();
int catTime = cats.getFirst().getTime();
if (catTime < dogTime) {
return dequeueCat();
} else {
return dequeueDog();
}
}
}
public String dequeueDog() {
String name = dogs.getFirst().getName();
dogs.removeFirst();
return name;
}
public String dequeueCat() {
String name = cats.getFirst().getName();
cats.removeFirst();
return name;
}
}
Single Queue
class Node {
String name;
int type;
Node(String name, int type) {
this.name = name;
this.type = type;
}
}
public class AnimalShelter {
Queue<Node> queue;
public AnimalShelter() {
// do initialize if necessary
queue = new LinkedList<Node>();
}
/**
* @param name a string
* @param type an integer, 1 if Animal is dog or 0
* @return void
*/
void enqueue(String name, int type) {
// Write your code here
queue.offer(new Node(name, type));
}
public String dequeueAny() {
// Write your code here
Node node = queue.poll();
return node.name;
}
public String dequeueDog() {
// Write your code here
return dequeueType(1);
}
public String dequeueCat() {
// Write your code here
return dequeueType(0);
}
private String dequeueType(int type) {
int shiftTime = 0;
while (queue.peek().type != type) {
queue.offer(queue.poll());
shiftTime++;
}
Node node = queue.poll();
shiftTime = queue.size() - shiftTime;
while (shiftTime != 0) {
queue.offer(queue.poll());
shiftTime--;
}
return node.name;
}
}