stack8.hpp
1 #ifndef STACK_HPP
2 #define STACK_HPP
3
4 #include <deque>
5 #include <stdexcept>
6 //#include <allocator>
7 using namespace std;
8
9 template<typename T, template<typename ELEM,
10 typename = allocator<ELEM> >
11 class CONT = deque>
12 class Stack
13 {
14 private:
15 CONT<T> elems;
16 public:
17 void push(const T&);
18 void pop();
19 const T top();
20 const bool empty()
21 {
22 return elems.empty();
23 }
24
25 template<typename T2,
26 template<typename ELEM2,
27 typename = allocator<ELEM2>
28 >class CONT2>
29 Stack<T, CONT>& operator=(const Stack<T2, CONT2>&);
30 };
31
32 template<typename T, template<typename, typename> class CONT>
33 void Stack<T, CONT>::push(const T& elem)
34 {
35 elems.push_back(elem);
36 }
37
38 template<typename T, template<typename, typename> class CONT>
39 void Stack<T, CONT>::pop()
40 {
41 if(elems.empty())
42 {
43 throw out_of_range("Stack<>::pop(): empty stack");
44 }
45 elems.pop_back();
46 }
47
48 template<typename T, template<typename, typename> class CONT>
49 const T Stack<T, CONT>::top()
50 {
51 if(elems.empty())
52 {
53 throw out_of_range("Stack<>::top(): empty stack");
54 }
55 return elems.back();
56 }
57
58 template<typename T, template<typename, typename> class CONT>
59 template<typename T2, template<typename, typename> class CONT2>
60 Stack<T, CONT>& Stack<T, CONT>::operator=(const Stack<T2, CONT2>& op2)
61 {
62 if((void*)this == (void*)&op2)
63 {
64 return *this;
65 }
66
67 Stack<T2> tmp(op2);
68
69 elems.clear();
70 while(!tmp.empty())
71 {
72 elems.push_front(tmp.top());
73 tmp.pop();
74 }
75 return *this;
76 }
77
78 #endif
1 #ifndef STACK_HPP
2 #define STACK_HPP
3
4 #include <deque>
5 #include <stdexcept>
6 //#include <allocator>
7 using namespace std;
8
9 template<typename T, template<typename ELEM,
10 typename = allocator<ELEM> >
11 class CONT = deque>
12 class Stack
13 {
14 private:
15 CONT<T> elems;
16 public:
17 void push(const T&);
18 void pop();
19 const T top();
20 const bool empty()
21 {
22 return elems.empty();
23 }
24
25 template<typename T2,
26 template<typename ELEM2,
27 typename = allocator<ELEM2>
28 >class CONT2>
29 Stack<T, CONT>& operator=(const Stack<T2, CONT2>&);
30 };
31
32 template<typename T, template<typename, typename> class CONT>
33 void Stack<T, CONT>::push(const T& elem)
34 {
35 elems.push_back(elem);
36 }
37
38 template<typename T, template<typename, typename> class CONT>
39 void Stack<T, CONT>::pop()
40 {
41 if(elems.empty())
42 {
43 throw out_of_range("Stack<>::pop(): empty stack");
44 }
45 elems.pop_back();
46 }
47
48 template<typename T, template<typename, typename> class CONT>
49 const T Stack<T, CONT>::top()
50 {
51 if(elems.empty())
52 {
53 throw out_of_range("Stack<>::top(): empty stack");
54 }
55 return elems.back();
56 }
57
58 template<typename T, template<typename, typename> class CONT>
59 template<typename T2, template<typename, typename> class CONT2>
60 Stack<T, CONT>& Stack<T, CONT>::operator=(const Stack<T2, CONT2>& op2)
61 {
62 if((void*)this == (void*)&op2)
63 {
64 return *this;
65 }
66
67 Stack<T2> tmp(op2);
68
69 elems.clear();
70 while(!tmp.empty())
71 {
72 elems.push_front(tmp.top());
73 tmp.pop();
74 }
75 return *this;
76 }
77
78 #endif
stack8test.cpp
1 #include <iostream>
2 #include <string>
3 #include <cstdlib>
4 #include <vector>
5 #include "stack8.hpp"
6 using namespace std;
7
8 int main()
9 {
10 try
11 {
12 Stack<int> intStack;
13 Stack<float> floatStack;
14
15 intStack.push(24);
16 intStack.push(15000);
17
18 floatStack.push(13.5);
19
20 floatStack = intStack;
21
22 cout << floatStack.top() << endl;
23 floatStack.pop();
24 cout << floatStack.top() << endl;
25 floatStack.pop();
26 cout << floatStack.top() << endl;
27 floatStack.pop();
28 }
29 catch(const exception& ex)
30 {
31 cerr << "Exception: " << ex.what() << endl;
32 }
33
34 Stack<int, vector> vStack;
35 vStack.push(24);
36 vStack.push(7);
37 cout << vStack.top() << endl;
38 vStack.pop();
39 cin.get();
40 }
41
1 #include <iostream>
2 #include <string>
3 #include <cstdlib>
4 #include <vector>
5 #include "stack8.hpp"
6 using namespace std;
7
8 int main()
9 {
10 try
11 {
12 Stack<int> intStack;
13 Stack<float> floatStack;
14
15 intStack.push(24);
16 intStack.push(15000);
17
18 floatStack.push(13.5);
19
20 floatStack = intStack;
21
22 cout << floatStack.top() << endl;
23 floatStack.pop();
24 cout << floatStack.top() << endl;
25 floatStack.pop();
26 cout << floatStack.top() << endl;
27 floatStack.pop();
28 }
29 catch(const exception& ex)
30 {
31 cerr << "Exception: " << ex.what() << endl;
32 }
33
34 Stack<int, vector> vStack;
35 vStack.push(24);
36 vStack.push(7);
37 cout << vStack.top() << endl;
38 vStack.pop();
39 cin.get();
40 }
41
To make sure that a member of a class template, for which the type is parameterized, gets initialized, you have to define a default constructor that uses an initializer list to initialize the member.