类模板Queue的实现

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 
  5 template <class Type> class Queue;
  6 template <class T > ostream & operator << (ostream &os, const Queue<T> &);
  7 
  8 template <class Type> class QueueItem {
  9     friend class Queue<Type >;
 10     friend ostream & operator << <Type> (ostream &os, const Queue<Type> &);
 11     //private class
 12     QueueItem(const Type &val) : Item(val), next(0) {}
 13     Type Item;
 14     QueueItem<Type > *next;
 15 };
 16 
 17 template <class Type> class Queue {
 18     friend ostream & operator << <Type> (ostream &os, const Queue<Type> &);
 19 
 20 public:
 21     Queue() : head(0), tail(0) {}
 22     template <class It> Queue(It _beg, It _end) : head(0), tail(0) { copy_elems(_beg, _end); }
 23     Queue(const Queue<Type> &Q) : head(0), tail(0) { copy_elems(Q); }
 24     Queue& operator = (const Queue &Q);
 25     ~Queue() { Destroy(); }
 26     template <class Iter> void _assign(Iter, Iter);
 27     Type &_front() { return head->Item; }
 28     const Type &_front() const { return head->Item; }
 29     void _push(const Type&);
 30     void _pop();
 31     bool _empty() const { return head == 0; }
 32 
 33 private:
 34     QueueItem<Type> *head;
 35     QueueItem<Type> *tail;
 36     void Destroy();
 37     void copy_elems(const Queue<Type> &);
 38     template <class Iter> void copy_elems(Iter, Iter);
 39 };
 40 
 41 template <class Type> Queue<Type>& Queue<Type>::operator = (const Queue<Type> &q)
 42 {
 43     if (this != &q) {
 44         head = tail = 0;
 45         for (QueueItem<Type> *pt = q.head; pt; pt= pt->next) {
 46             _push(pt->Item);
 47         }
 48     }
 49     return *this;
 50 }
 51 
 52 template <class Type> void Queue<Type>::copy_elems(const Queue<Type> &q)
 53 {
 54     for (QueueItem<Type> *pt = q.head; pt; pt = pt->next) {
 55         _push(pt->Item);
 56     }
 57 }
 58 template <class Type> template <class Iter> void Queue<Type>::copy_elems(Iter _beg, Iter _end)
 59 {
 60     while (_beg != _end) {
 61         _push(*_beg);
 62         ++_beg;
 63     }
 64 }
 65 
 66 template <class Type> template <class Iter> void Queue<Type>::_assign(Iter _beg, Iter _end)
 67 {
 68     head = tail = 0;
 69     copy_elems(_beg, _end);
 70 }
 71 
 72 template <class Type> void Queue<Type>::_push(const Type& val)
 73 {
 74     QueueItem<Type> *p = new QueueItem<Type>(val);
 75     if (_empty()) {
 76         head = tail = p;
 77     } else {
 78         tail->next = p;
 79         tail = p;
 80     }
 81 }
 82 
 83 template <class Type> void Queue<Type>::_pop()
 84 {
 85     QueueItem<Type> *p = head;
 86     head = head->next;
 87     delete p;
 88 }
 89 
 90 template <class Type> ostream & operator << (ostream &os, const Queue<Type> &q)
 91 {
 92     for (QueueItem<Type> *pt = q.head; pt; pt = pt->next) {
 93         os << pt->Item << " ";
 94     }
 95     os << endl;
 96     return os;
 97 }
 98 
 99 template <class Type> void Queue<Type>::Destroy()
100 {
101     while (!_empty()) _pop();
102 }
103 
104 
105 int main()
106 {
107     Queue<int >que;
108     que._push(1);
109     que._push(2);
110     que._push(3);
111     que._push(4);
112     cout << que;
113     que._pop();
114     cout << que;
115     Queue<int >q2, q1(que);
116     cout << q1;
117     cout << q2._empty() << endl;
118     q2 = q1;
119     cout << q2;
120     while (!que._empty()) {
121         cout << que._front() << endl;
122         que._pop();
123     }
124     vector<int > vet(10, 7);
125     for (int i = 0; i < (int)vet.size(); i++) {
126         cout << vet[i] << ' ';
127     }
128     cout << endl;
129     que._assign(vet.begin(), vet.end());
130     cout << que;
131     return 0;
132 }
View Code

posted @ 2014-05-14 21:54  ihge2k  阅读(351)  评论(0编辑  收藏  举报