說明(2018-3-21 22:46:22):
1. 棧花了好幾天才隱約弄明白,疑問主要在於棧的棧頂和棧底到底是怎么個構造。
(1)郝斌講的是,棧底指向了一個空節點,棧頂指向每一個新增加的節點,如圖:
(2)嚴蔚敏書中講的是,棧底指向了第一個節點,棧頂指向了最后一個節點的上面節點,如圖:
(3)如果按照郝斌的圖示,總感覺后面的push的代碼難以理解,為什么ps->pTop = pNew;,不應該是么ps->pTop->pNext = pNew嗎?
后來自己畫了一個圖,比較適合自己理解,左邊是含有兩個節點的棧,右邊是pop一次之后的棧,理解的核心就是,pTop其實就等於新的節點!
當然這樣理解可能不准確,不過確實方便寫代碼,起碼能想的通。而且我查了很多網上的說法,也是眾說紛紜,總結了一下,沒必要弄明白棧頂和棧底到底長啥樣,只需要知道棧里有這兩個成員,能實現壓棧和出棧就可以了!
2. 關於代碼的問題,最后一個Clear函數,郝斌用了兩個變量p和q來循環釋放每個節點的內存:
但我想的是像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 }