一個C語言鏈式結構實現的棧 mStack (GCC編譯)。函數
1 /** 2 * @brief C語言實現的鏈式結構類型的棧 3 * @author wid 4 * @date 2013-10-30 5 * 6 * @note 若代碼存在 bug 或程序缺陷, 請留言反饋, 謝謝! 7 */ 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 #define TRUE 1 13 #define FALSE 0 14 15 typedef struct SNODE 16 { 17 void *pelm; //元素指針 18 struct SNODE *next; //指向下一棧節點 19 }StackNode; 20 21 typedef struct 22 { 23 StackNode *btm; //棧底指針 24 StackNode *top; //指向棧頂元素 25 int height; //棧高度 26 }mStack; 27 28 //棧方法聲明 29 30 mStack *CreateStack(); //建立一個空的棧 31 void DestroyStack( mStack *pStack ); //銷燬棧 32 void ClearStack( mStack *pStack ); //清空棧內元素 33 int GetHeight( mStack *pStack ); //獲取棧高度 34 int IsEmpty( mStack *pStack ); //檢測是否爲空棧 35 int Push( mStack *pStack, void *pdata ); //向棧內壓入元素 36 int Pop( mStack *pStack, void **pdata ); //將棧頂元素出棧 37 int GetTop( mStack *pStack, void **pdata ); //獲取棧頂元素 38 void ForEachStack( mStack *pStack, void (*func)(void *pdata) ); //從棧頂到棧底的每一個元素依次執行 func 函數 39 40 41 //棧方法實現 42 43 /** 44 * @brief 建立一個高度爲 nHeight 的棧 45 * 46 * @return 返回指向新建的棧的指針 47 */ 48 mStack *CreateStack() 49 { 50 ///建立一個棧 51 mStack *pStack = (mStack *)malloc( sizeof(mStack) ); 52 53 ///令棧頂指向棧底指向NULL 54 pStack->top = pStack->btm = NULL; 55 56 ///初始棧高度爲0 57 pStack->height = 0; 58 } 59 60 /** 61 * @brief 銷燬棧 pStack 62 * 63 * @param pStack 指向待銷燬的棧的指針 64 * 65 * @return void 66 */ 67 void DestroyStack( mStack *pStack ) 68 { 69 StackNode *tmp = NULL; 70 71 ///釋放棧內節點 72 while( tmp != NULL ) 73 { 74 tmp = pStack->top->next; 75 free( pStack->top ); 76 pStack->top = tmp; 77 } 78 79 ///釋放棧 80 free( pStack ); 81 } 82 83 /** 84 * @brief 清空棧內元素 85 * 86 * @param pStack 指向待清空元素的棧的指針 87 * 88 * @return void 89 */ 90 void ClearStack( mStack *pStack ) 91 { 92 StackNode *tmp = NULL; 93 while( tmp != NULL ) 94 { 95 tmp = pStack->top->next; 96 free( pStack->top ); 97 pStack->top = tmp; 98 } 99 100 pStack->top = pStack->btm = NULL; 101 102 pStack->height = 0; 103 } 104 105 /** 106 * @brief 獲取棧當前高度 107 * 108 * @param 指向待獲取高度的棧的指針 109 * 110 * @return 返回棧當前高度 111 */ 112 int GetHeight( mStack *pStack ) 113 { 114 return pStack->height; 115 } 116 117 /** 118 * @brief 檢測是否爲空棧 119 * 120 * @param pStack 指向待檢測的棧的指針 121 * 122 * @return 若爲空, 則返回 TRUE, 不然返回 FALSE 123 */ 124 int IsEmpty( mStack *pStack ) 125 { 126 return pStack->height == 0 ? TRUE : FALSE; 127 } 128 129 /** 130 * @brief 向棧內壓入元素 131 * 132 * @param pStack 待壓入元素的棧 133 * @param pdata 指向待壓入棧元素的指針 134 * 135 * @return 返回成功入棧後棧的高度 136 */ 137 int Push( mStack *pStack, void *pdata ) 138 { 139 ///建立一個棧節點 140 StackNode *pNode = (StackNode *)malloc( sizeof(StackNode) ); 141 142 ///爲該節點賦值 143 pNode->pelm = pdata; 144 pNode->next = pStack->top; 145 146 ///令棧頂指向最新節點 147 pStack->top = pNode; 148 149 ++pStack->height; 150 } 151 152 /** 153 * @brief 將棧頂元素出棧 154 * 155 * @param pStack 指向待執行出棧操做的棧的指針 156 * @param pdata 接收彈出的元素的指針 157 * 158 * @return 出棧成功則返回出棧後棧的高度, 不然返回 -1 159 */ 160 int Pop( mStack *pStack, void **pdata ) 161 { 162 ///檢測是否爲空棧 163 if( pStack->top == pStack->btm ) 164 return -1; 165 166 ///取得棧節點數據元素值 167 *pdata = pStack->top->pelm; 168 169 ///將棧頂指針向下退一位 170 StackNode *p = pStack->top->next; 171 free( pStack->top ); 172 pStack->top = p; 173 174 return --pStack->height; 175 } 176 177 /** 178 * @brief 獲取棧頂元素到 pt 179 * 180 * @param pStack 指向待彈出元素的棧的指針 181 * @param pdata 指向接收彈出的元素的指針 182 * 183 * @return 獲取成功則返回棧頂元素的位置, 不然返回 -1 184 * 185 * @note 元素位置由 0 計起 186 */ 187 int GetTop( mStack *pStack, void **pdata ) 188 { 189 ///檢測是否爲空棧 190 if( pStack->height == 0 ) 191 return -1; 192 193 *pdata = pStack->top->pelm; 194 195 return pStack->height - 1; 196 } 197 198 /** 199 * @brief 從棧底到棧頂的每一個元素依次執行 func 函數 200 * 201 * @param pStack 指向待處理的棧的指針 202 * @param func 須要執行的函數的指針 203 * 204 * @return void 205 */ 206 void ForEachStack( mStack *pStack, void (*func)(void *pt) ) 207 { 208 StackNode *tmp = pStack->top; 209 while( tmp != NULL ) 210 { 211 func( tmp->pelm ); 212 tmp = tmp->next; 213 } 214 } 215 216 void display( void *pn ) 217 { 218 printf( "%d ", *(int *)pn ); 219 } 220 221 int main() 222 { 223 int a = 10, b = 20, c = 30, n = 0; 224 void *pa = NULL; 225 226 ///測試 CreateStack 227 mStack *psk = CreateStack(); 228 229 ///測試 IsEmpty、GetHeight 230 if( IsEmpty(psk) == TRUE ) 231 printf( "Init Height = %d\n", GetHeight(psk) ); 232 233 ///測試 Push 234 printf("壓入數字 10\n"); Push( psk, &a ); 235 printf("壓入數字 20\n"); Push( psk, &b ); 236 printf( "壓入2元素後棧高度 = %d\n", GetHeight(psk) ); 237 238 ///測試 Pop 239 printf( "\n測試 Pop:\n" ); 240 n = Pop( psk, &pa ); 241 if( n != -1 ) 242 printf( "Pop = %d\n", *(int *)pa ); 243 244 n = Pop( psk, &pa ); 245 if( n != -1 ) 246 printf( "Pop = %d\n", *(int *)pa ); 247 248 n = Pop( psk, &pa ); 249 if( n != -1 ) 250 printf( "Pop = %d\n", *(int *)pa ); 251 252 ///測試清空棧 253 Push( psk, &a ); 254 printf("\n清空棧.."); 255 ClearStack( psk ); 256 printf( "\n清空後棧高度 = %d\n", GetHeight(psk) ); 257 258 ///測試 ForEachStack 259 printf("\n\壓入3元素.."); 260 Push( psk, &a ); 261 Push( psk, &b ); 262 Push( psk, &c ); 263 printf("\n測試 ForEachStack: "); ForEachStack( psk, display ); 264 265 ///測試GetTop 266 printf("\n測試GetTop:\n"); 267 n = GetTop( psk, &pa ); 268 if( n != -1 ) 269 printf( "GetTop = %d\n", *(int *)pa ); 270 271 ///再次輸出當前棧高度 272 printf( "\n當前棧高度Height = %d\n", GetHeight(psk) ); 273 274 ///測試 DestroyStack 275 printf("\n銷燬棧..\n"); 276 DestroyStack( psk ); 277 278 return 0; 279 }
測試運行:測試
若代碼存在 bug 或程序缺陷, 請留言反饋, 謝謝。 spa