說明(2018-3-21 22:46:22):函數
1. 棧花了好幾天才隱約弄明白,疑問主要在於棧的棧頂和棧底究竟是怎麼個構造。spa
(1)郝斌講的是,棧底指向了一個空節點,棧頂指向每個新增長的節點,如圖:code
(2)嚴蔚敏書中講的是,棧底指向了第一個節點,棧頂指向了最後一個節點的上面節點,如圖:blog
(3)若是按照郝斌的圖示,總感受後面的push的代碼難以理解,爲何ps->pTop = pNew;,不該該是麼ps->pTop->pNext = pNew嗎?內存
後來本身畫了一個圖,比較適合本身理解,左邊是含有兩個節點的棧,右邊是pop一次以後的棧,理解的核心就是,pTop其實就等於新的節點!it
固然這樣理解可能不許確,不過確實方便寫代碼,起碼能想的通。並且我查了不少網上的說法,也是衆說紛紜,總結了一下,不必弄明白棧頂和棧底到底長啥樣,只須要知道棧裏有這兩個成員,能實現壓棧和出棧就能夠了!io
2. 關於代碼的問題,最後一個Clear函數,郝斌用了兩個變量p和q來循環釋放每一個節點的內存:class
但我想的是像pop裏那樣刪除,直到棧頂和棧底重合:變量
也能達到清空棧的效果,可是是否能釋放掉裏面節點的內存就不知道了,不知如何檢測?循環
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 5 typedef struct Node 6 { 7 int data; 8 struct Node * pNext; 9 }NODE, *PNODE; 10 11 typedef struct Stack 12 { 13 PNODE pTop; 14 PNODE pBottom; 15 }STACK, *PSTACK; 16 17 void Init(PSTACK ps); 18 void Push(PSTACK ps, int val); 19 void Show(PSTACK ps); 20 void Pop(PSTACK ps, int*val); 21 void ShowEnter(); 22 void Clear(PSTACK ps); 23 24 void main() 25 { 26 STACK s; 27 Init(&s); 28 Push(&s, 11); 29 Push(&s, 22); 30 Push(&s, 33); 31 Push(&s, 44); 32 Push(&s, 55); 33 Show(&s); 34 ShowEnter(); 35 int val; 36 Pop(&s, &val); 37 Show(&s); 38 printf("刪除的值是%d", val); 39 ShowEnter(); 40 Clear(&s); 41 Show(&s); 42 ShowEnter(); 43 44 system("pause"); 45 } 46 47 void Init(PSTACK ps) 48 { 49 ps->pTop = (PNODE)malloc(sizeof(NODE)); 50 if (ps->pTop == NULL) 51 { 52 exit(-1); 53 } 54 ps->pBottom = ps->pTop; 55 return; 56 } 57 58 void Push(PSTACK ps, int val) 59 { 60 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 61 pNew->data = val; 62 pNew->pNext = ps->pTop; 63 ps->pTop = pNew; 64 } 65 66 void Pop(PSTACK ps, int*val) 67 { 68 if (ps->pTop != ps->pBottom) 69 { 70 *val = ps->pTop->data; 71 printf("ps->pTop的值是%d\n", ps->pTop->data); 72 //free(ps->pTop);不能加這句,不能釋放ps->pTop,緣由我也不知道,按理說free只是把裏面的數值清空,可是加了這句會報錯。 73 //如今知道了,要先把ps->pTop保存到p裏,再把p釋放。 74 PNODE p = ps->pTop; 75 ps->pTop = ps->pTop->pNext; 76 free(p); 77 p = NULL; 78 } 79 return; 80 } 81 82 void Show(PSTACK ps) 83 { 84 PNODE p = ps->pTop; 85 while (p != ps->pBottom) 86 { 87 printf("%d ", p->data); 88 p = p->pNext; 89 } 90 return; 91 } 92 93 void ShowEnter() 94 { 95 printf("\n"); 96 } 97 98 void Clear(PSTACK ps) 99 { 100 while (ps->pTop != ps->pBottom) 101 { 102 PNODE p = ps->pTop; 103 ps->pTop = ps->pTop->pNext; 104 free(p); 105 p = NULL; 106 } 107 return; 108 }