00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef STACK_TEMPLATE_H
00024 #define STACK_TEMPLATE_H
00025
00029 template<class T>
00030 class Stack {
00031
00032 private:
00033 T *data;
00034 T *curr;
00035 int sz;
00036 int items;
00037
00038 public:
00040 Stack(int s) {
00041 items = 0;
00042 data = curr = new T[sz = (s > 0 ? s : 1)];
00043 }
00044
00045
00047 ~Stack(void) {
00048 if(data)
00049 delete [] data;
00050 }
00051
00052 int max_stack_size(void) { return sz; }
00053 int stack_size(void) { return items; }
00054 int num(void) { return items; }
00055
00057 int push(const T& a) {
00058 if (items < sz) {
00059 *curr++ = a;
00060 items++;
00061 } else {
00062 return -1;
00063 }
00064 return 0;
00065 }
00066
00067
00069 int dup(void) {
00070 if (items > 0) {
00071 return push(top());
00072 } else if(sz > 0) {
00073 curr++;
00074 items++;
00075 }
00076 return 0;
00077 }
00078
00079
00081 T& pop(void) {
00082 if (items > 0) {
00083 items--;
00084 return (*--curr);
00085 } else {
00086 return *data;
00087 }
00088 }
00089
00090
00092 T& top(void) {
00093 if (items > 0) {
00094 return *(curr - 1);
00095 } else {
00096 return *data;
00097 }
00098 }
00099
00100
00102
00103
00104
00105
00106 void clear(void) {
00107 items = 0;
00108 curr = data;
00109
00110 memset(data, 0, sizeof(T)*sz);
00111 }
00112
00113 };
00114
00115 #endif
00116