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 }