说明(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 }