1 #include <iostream>
2 #include <assert.h>
3
4 using namespace std;
5
6 template<class T>
7 class STACK
8 {
9 public:
10 STACK(int sz = 100):top(-1), maxLen(sz)
11 {
12 date = new T[sz];
13 assert(date != NULL);
14 }
15 ~STACK(){delete []date;}
16 void Push(const T& a);
17 bool Pop(T& x);
18 bool Top(T& x);
19 bool Empty() const{return top == -1;}
20 bool Full(){return top == maxLen-1;}
21 int Size(){return top+1;}
22 void Clear(){top = -1;}
23 friend ostream& operator << (ostream& os, const STACK<T>& s)
24 {
25 for(int i = 0; i <= s.top; i++)
26 os<<s.date[i]<<" ";
27 return os;
28 }
29 private:
30 T *date;
31 int top;
32 int maxLen;
33 void overflow();
34 };
35
36 template<class T>
37 bool STACK<T>::Top(T& x)
38 {
39 if(Empty())return false;
40 x = date[top];
41 return true;
42 }
43
44 template<class T>
45 void STACK<T>::overflow()
46 {
47 T* newdate = new T[maxLen<<1];
48 if(newdate == NULL)return;
49 for(int i = 0; i <= top; i++)
50 newdate[i] = date[i];
51 maxLen <<= 1;
52 delete []date;
53 date = newdate;
54 }
55
56 template<class T>
57 void STACK<T>::Push(const T& a)
58 {
59 if(Full())overflow();
60 date[++top] = a;
61 }
62
63 template<class T>
64 bool STACK<T>::Pop(T& x)
65 {
66 if(Empty())return false;
67 x = date[top--];
68 return true;
69 }
70
71 int main()
72 {
73 int tmp;
74 STACK<int> s;
75 for(int i = 0; i < 10; i++)
76 s.Push(i);
77 cout << s << endl;
78 s.Pop(tmp);
79 cout << s << endl;
80 s.Top(tmp);
81 cout << tmp << endl;
82 return 0;
83 }