0%

猫狗队列

题目

宠物、狗和猫的类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Pet {
private String type;

public Pet(String type) {
this.type = type;
}

public String getPetType() {
return this.type;
}
}

public class Dog extends Pet {
public Dog() {
super("dog");
}
}

public class Cat extends Pet {
public Cat() {
super("cat");
}
}

实现一种猫狗队列的结构, 要求如下:

  • add, 将cat或dog类的实例放入队列中
  • pollAll, 将队列中所有实例按照入队先后顺序出队
  • pollDog, 将队列中dog类实例按入队顺序出队
  • pollCat, 同上
  • isEmpty, 检查队列中是否还有元素
  • isDogEmpty, 检查队列中是否有dog类实例
  • isCatEmpty, 检查队列中是否有cat类实例

思路

用三个队列, 一个cat队列只存放cat实例, 一个dog队列只存放dog实例, 再用总队列存放所有实例.

  • 但是这样移除元素的时候, 总队列怎么更新? 比如队列顺序是 {cat1, dog1, dog2}, 调用pollDog(), 无法维护

  • 加一层封装尝试解决问题, 用一个容器类PetQueueItem来封装Pet及其子类, 同时增加count属性来表示全局入队顺序

  • 果然没有什么问题是加一层封装解决不了的QAQ

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
public class DogCatQueue {
public class Pet {
private String type;

public Pet(String type) {
this.type = type;
}

public String getPetType() {
return this.type;
}
}

public class Dog extends Pet {
public Dog() {
super("dog");
}
}

public class Cat extends Pet {
public Cat() {
super("cat");
}
}

public class PetQueueItem {
private Pet pet;
private Long count;

public PetQueueItem(Pet pet, Long count) {
this.pet = pet;
this.count = count;
}

public Pet getPet() {
return this.pet;
}

public Long getCount() {
return this.count;
}

public String getPetType() {
return this.pet.getPetType();
}
}

private Queue<PetQueueItem> dogQueue;
private Queue<PetQueueItem> catQueue;
private Long count;

public DogCatQueue() {
this.dogQueue = new LinkedList<PetQueueItem>();
this.catQueue = new LinkedList<PetQueueItem>();
this.count = 0L;
}

public void add(Pet pet) {
if (pet.getPetType().equals("dog")) {
this.dogQueue.add(new PetQueueItem(pet, count++));
} else if (pet.getPetType().equals("cat")) {
this.catQueue.add(new PetQueueItem(pet, count++));
} else {
throw new RuntimeException("Pet must be dog or cat!");
}
}

public Pet pollAll() {
if (isDogEmpty() && isCatEmpty()) {
throw new RuntimeException("Your queue is empty!");
}
if (!isDogEmpty() && !isCatEmpty()) {
if (dogQueue.peek().getCount() < catQueue.peek().getCount()) {
return dogQueue.poll().getPet();
} else {
return catQueue.poll().getPet();
}
}
if (!isDogEmpty()) {
return dogQueue.poll().getPet();
}
return catQueue.poll().getPet();
}

public Dog pollDog() {
if (isDogEmpty()) {
throw new RuntimeException("Your dog queue is empty!");
}
return (Dog) dogQueue.poll().getPet();
}

public Cat pollCat() {
if (isCatEmpty()) {
throw new RuntimeException("Your cat queue is empty!");
}
return (Cat) dogQueue.poll().getPet();
}

public Boolean isEmpty() {
return isDogEmpty() && isCatEmpty();
}

public Boolean isDogEmpty() {
return dogQueue.isEmpty();
}

public Boolean isCatEmpty() {
return catQueue.isEmpty();
}

}