纪念逝去的岁月——C++实现一个栈(使用类模板)
这个版本是上个版本的加强版,上个版本的代码:http://www.cnblogs.com/fengbohello/p/4542912.html
1、代码
2、运行结果
1、代码
1 #include <stdio.h> 2 #include <string.h> 3 4 //#define USEDEBUG 5 6 #ifdef USEDEBUG 7 #define DEBUG(fmt, arg...) 8 do{ 9 printf("%s %d %s() : ", __FILE__, __LINE__, __func__); 10 printf(fmt, ##arg); 11 }while(0) 12 #else 13 #define DEBUG(fmt, arg...) 14 #endif 15 16 template<typename T> class ClsStack 17 { 18 private : 19 T ** __m_Data; 20 int __m_pos; 21 size_t __m_memsize; 22 23 protected : 24 int __resize(size_t n); 25 size_t __doublesize(size_t n); 26 27 public : 28 ClsStack(size_t n = 0); 29 ~ClsStack(); 30 31 int pop (T ** ppData); 32 int top (T ** ppData); 33 int push(T * pData); 34 void clear(); 35 36 void printStack(T * p[], size_t pos); 37 }; 38 39 template<typename T> ClsStack<T>::ClsStack(size_t n) 40 { 41 __m_Data = NULL; 42 __m_pos = -1; 43 __m_memsize = 0; 44 45 if(0 != n) 46 { 47 __m_Data = new T * [n]; 48 if(NULL != __m_Data) 49 { 50 __m_memsize = n; 51 } 52 } 53 } 54 55 template<typename T> ClsStack<T>::~ClsStack() 56 { 57 if(NULL != __m_Data) 58 { 59 delete __m_Data; 60 __m_Data = NULL; 61 } 62 __m_pos = -1; 63 __m_memsize = 0; 64 } 65 66 template<typename T> size_t ClsStack<T>::__doublesize(size_t n) 67 { 68 size_t x = 0; 69 if(0 == n) 70 { 71 x = 1; 72 } 73 else 74 { 75 x = n * 2; 76 } 77 78 return x; 79 } 80 81 template<typename T> int ClsStack<T>::__resize(size_t n) 82 { 83 T ** p = new T * [n]; 84 if(NULL == p) 85 { 86 return -1; 87 } 88 memset(p, 0, sizeof(T *) * (n)); 89 if(NULL != __m_Data) 90 { 91 //printStack(__m_Data, __m_pos); 92 if( NULL == memcpy(p, __m_Data, __m_memsize * sizeof(T *))) 93 { 94 DEBUG("memcpy faild\n"); 95 delete p; 96 return -1; 97 } 98 //printStack(p, __m_pos); 99 delete __m_Data; 100 } 101 __m_Data = p; 102 __m_memsize = n; 103 104 return 0; 105 } 106 107 template<typename T> int ClsStack<T>::pop(T ** ppData) 108 { 109 if(NULL == ppData) 110 { 111 return -1; 112 } 113 int r = 0; 114 if(-1 == __m_pos) 115 { 116 *ppData = NULL; 117 r = -1; 118 } 119 else 120 { 121 *ppData = __m_Data[__m_pos --]; 122 r = 0; 123 DEBUG("memsize : [%u], pos : [%d], p = [0X%08X]\n", __m_memsize, __m_pos + 1, (unsigned int)*ppData); 124 } 125 126 return r; 127 } 128 129 template<typename T> int ClsStack<T>::top(T ** ppData) 130 { 131 if(NULL == ppData) 132 { 133 return -1; 134 } 135 int r = 0; 136 if(-1 == __m_pos) 137 { 138 *ppData = NULL; 139 r = -1; 140 } 141 else 142 { 143 *ppData = __m_Data[__m_pos]; 144 r = 0; 145 } 146 147 return r; 148 } 149 150 template<typename T> int ClsStack<T>::push(T * pData) 151 { 152 if(__m_pos + 1 >= __m_memsize) 153 { 154 size_t n = __doublesize(__m_memsize); 155 if(0 != __resize(n)) 156 { 157 return -1; 158 } 159 } 160 __m_Data[++__m_pos] = pData; 161 DEBUG("memsize : [%u], pos : [%d], p = [0X%08X]\n", __m_memsize, __m_pos, (unsigned int)__m_Data[__m_pos]); 162 163 return 0; 164 } 165 166 template<typename T> void ClsStack<T>::clear() 167 { 168 if(NULL != __m_Data && 0 != __m_memsize) 169 { 170 delete __m_Data; 171 } 172 __m_Data = NULL; 173 __m_pos = -1; 174 __m_memsize = 0; 175 } 176 177 template<typename T> void ClsStack<T>::printStack(T * p[], size_t pos) 178 { 179 int i = 0; 180 for(i = 0; i <= pos; i++) 181 { 182 printf("[%08u] = [0X%08X]\n", i, NULL == p ? 0 : p[i]); 183 } 184 printf("----------------------------\n"); 185 } 186 187 #define TEST_EQ(a, b)188 do{189 if(a == b)190 {191 printf("\033[0;32m[SUCCESS %5d]\033[0m\n", __LINE__);192 }193 else194 {195 printf("\033[0;31m[FAILD %5d]\033[0m\n", __LINE__);196 }197 }while(0) 198 199 int main() 200 { 201 ClsStack<int> objStack; 202 int x = 10; 203 int * p = &x; 204 objStack.push(p); 205 int i = 0; 206 for(i = 0; i <= 10; i++) 207 { 208 int * z = new int; 209 *z = i; 210 objStack.push(z); 211 } 212 for(i = 10; i >= 0; i--) 213 { 214 int * z = NULL; 215 int r = objStack.pop(&z); 216 if(NULL == z) 217 { 218 printf("z == NULL\n"); 219 continue; 220 } 221 TEST_EQ(i, *z); 222 delete z; 223 } 224 int * g = NULL; 225 int r = objStack.pop(&g); 226 TEST_EQ(x, *g); 227 }
2、运行结果
2.1、编译
g++ -g -c -o stack.o stack.cpp
g++ -g -o stack stack.o
2.2、运行结果
$ ./stack [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 221] [SUCCESS 226]
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。