《Cracking the Coding Interview》——第3章:栈和队列——题目7

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 }

 

你可能感兴趣的:(interview)