C語言 棧 鏈式結構 實現

一個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

相關文章
相關標籤/搜索