《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
算法构建了两个队列,一个存储猫,一个存储狗。一个猫对象或狗对象使用类
A
n
i
m
a
l
Animal
Animal表示,其中有其名字和进入收养所的时间(用order表示)。
e
n
q
u
e
u
e
enqueue
enqueue方法首先利用全局的
o
r
d
e
r
order
order变量来设置对象的
o
r
d
e
r
order
order变量并将全局
o
r
d
e
r
order
order变量加一,然后根据名字确定对象类型然后让其进入到特定的队列。
d
e
q
u
e
u
e
A
n
y
dequeueAny
dequeueAny方法首先判断猫队列或狗队列是否有一个为空,如果有一个为空则直接返回另一个队列的队首元素。如果两个元素都不为空则比较猫队列和狗队列队列的队首元素的
o
r
d
e
r
order
order变量(时间戳)的大小。将
o
r
d
e
r
order
order变量较小的对象返回。
class Animal
{
private:
int order;
protected:
string name;
public:
Animal(string str)
{
name = str;
}
void setOrder(int value)
{
order = value;
}
int getOrder()
{
return order;
}
bool isOlderThan(Animal a)
{
return order < a.getOrder();
}
string getName()
{
return name;
}
};
class AnimalQueue
{
private:
int order;
queue<Animal> dog;
queue<Animal> cat;
public:
void enqueue(Animal animal)
{
animal.setOrder(order);
order++;
if (animal.getName() != "cat")
{
dog.push(animal);
}
else
{
cat.push(animal);
}
}
Animal dequeueDog()
{
return dog.front();
dog.pop();
}
Animal dequeueCat()
{
return cat.front();
cat.pop();
}
Animal dequeueAny()
{
if (dog.size() == 0)
{
return dequeueDog();
}
else if(cat.size() == 0)
{
return dequeueCat();
}
Animal currentdog=dequeueDog();
Animal currentcat = dequeueCat();
if (currentdog.isOlderThan(currentcat))
{
return currentdog;
}
else
{
return currentcat;
}
}
};