zoukankan      html  css  js  c++  java
  • 数据结构学习笔记(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 }
  • 相关阅读:
    收集Linux常用命令
    loadrunner没有告诉你的
    loadrunner没有告诉你的
    loadrunner没有告诉你的
    QA、EPG、PMO各自的职能划分及关系是什么?
    QA、EPG、PMO各自的职能划分及关系是什么?
    QA、EPG、PMO各自的职能划分及关系是什么?
    loadrunner通过odbc测mysql数据库语句
    loadrunner通过odbc测mysql数据库语句
    loadrunner通过odbc测mysql数据库语句
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/8620556.html
Copyright © 2011-2022 走看看