数据结构学习笔记(5)——栈的创建,遍历,压栈,出栈,清空

说明(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
", 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("
");
 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 }
原文地址:https://www.cnblogs.com/Jacklovely/p/8620556.html