2014-03-19 03:20
题目:实现一个包含阿猫阿狗的先入先出队列,我要猫就给我一只来的最早的猫,要狗就给我一只来的最早的狗,随便要就给我一只来的最早的宠物。建议用链表实现。
解法:单链表可以实现一个简单的队列,这种有不同种类数据的队列,可以用if语句选择,也可以用一个堆做时间上的优化。对于来的时间,我用一个64位整数表示时间戳,在地球被太阳吃掉以前,这个数字是不大可能上溢的,所以问题应该不大。
代码:
1 // 3.7 Implement a queue that holds cats and dogs. If you want dog or cat, you get the oldest dog or cat. If you want a pet, you get the oldest of them all. 2 #include <iostream> 3 #include <string> 4 using namespace std; 5 6 template <class T> 7 struct ListNode { 8 T val; 9 long long int id; 10 ListNode *next; 11 12 ListNode(T _val = 0, long long int _id = 0): val(_val), id(_id), next(nullptr) {}; 13 }; 14 15 template <class T> 16 class CatsAndDogs { 17 public: 18 CatsAndDogs() { 19 first_cat = last_cat = first_dog = last_dog = nullptr; 20 current_id = 0; 21 } 22 23 void enqueue(T val, int dog_or_cat) { 24 switch (dog_or_cat) { 25 case 0: 26 // cat 27 if (first_cat == nullptr) { 28 first_cat = last_cat = new ListNode<T>(val, current_id); 29 } else { 30 last_cat->next = new ListNode<T>(val, current_id); 31 last_cat = last_cat->next; 32 } 33 break; 34 case 1: 35 // dog 36 if (first_dog == nullptr) { 37 first_dog = last_dog = new ListNode<T>(val, current_id); 38 } else { 39 last_dog->next = new ListNode<T>(val, current_id); 40 last_dog = last_dog->next; 41 } 42 break; 43 } 44 ++current_id; 45 } 46 47 T dequeueAny() { 48 if (first_cat == nullptr) { 49 return dequeueDog(); 50 } else if (first_dog == nullptr) { 51 return dequeueCat(); 52 } else if (first_cat->id < first_dog->id) { 53 return dequeueCat(); 54 } else { 55 return dequeueDog(); 56 } 57 } 58 59 T dequeueCat() { 60 T result; 61 62 result = first_cat->val; 63 if (first_cat == last_cat) { 64 delete first_cat; 65 first_cat = last_cat = nullptr; 66 } else { 67 ListNode<T> *ptr = first_cat; 68 first_cat = first_cat->next; 69 delete ptr; 70 } 71 72 return result; 73 } 74 75 T dequeueDog() { 76 T result; 77 78 result = first_dog->val; 79 if (first_dog == last_dog) { 80 delete first_dog; 81 first_dog = last_dog = nullptr; 82 } else { 83 ListNode<T> *ptr = first_dog; 84 first_dog = first_dog->next; 85 delete ptr; 86 } 87 88 return result; 89 } 90 private: 91 ListNode<T> *first_cat; 92 ListNode<T> *first_dog; 93 ListNode<T> *last_cat; 94 ListNode<T> *last_dog; 95 long long int current_id; 96 }; 97 98 int main() 99 { 100 CatsAndDogs<string> cd; 101 string val; 102 string type; 103 string cmd; 104 105 while (cin >> cmd) { 106 if (cmd == "end") { 107 break; 108 } else if (cmd == "in") { 109 cin >> type; 110 if (type == "cat") { 111 cin >> val; 112 cd.enqueue(val, 0); 113 } else if (type == "dog") { 114 cin >> val; 115 cd.enqueue(val, 1); 116 } 117 } else if (cmd == "out") { 118 cin >> type; 119 if (type == "cat") { 120 cout << "cat=" << cd.dequeueCat() << endl; 121 } else if (type == "dog") { 122 cout << "dog=" << cd.dequeueDog() << endl; 123 } else if (type == "any") { 124 cout << "any=" << cd.dequeueAny() << endl; 125 } 126 } 127 } 128 129 return 0; 130 }