數據結構學習筆記(5)——棧的建立,遍歷,壓棧,出棧,清空

說明(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 }
相關文章
相關標籤/搜索