• 2.(1)栈的链式存储、链栈的操作(图解、注释、代码)


    本人坚持更新C语言和数据结构知识,可以收藏+关注随时了解😜😜😜


    目录

    1.结构体定义

    2.初始化一个链栈

    2.1图解过程

    2.2代码

    3.压栈

    3.1图解过程

    3.2代码

    4.出栈

    4.1.图解过程 

    4.2代码

    5.栈的判空

    6.栈的遍历

    6.1图解过程

    6.2代码


    1.结构体定义

    栈的链式存储主要是用到了两个结构体

    一个结构体存放栈顶指针和栈底指针

            之所以这样,是因为栈属于一个操作受限的线性表,对栈的操作只能在栈顶执行

    一个结构体是存放结点

            结点包括数据域和指针域,类似于链表

    1. typedef struct Node //结点
    2. {
    3. int data;
    4. struct Node *pNext;
    5. } Node, *PNODE;
    6. // Node<=>struct Node
    7. // PNODE <=>struct Node *
    8. typedef struct Stack //存放栈顶指针和栈底指针
    9. {
    10. PNODE pTop; // pTop指向的数据类型为struct Node
    11. PNODE pBottom;
    12. } STACK, *PSTACK;
    13. //Stack<=>struct Stack
    14. //PSTACK<=>struct Stack*

    2.初始化一个链栈

    2.1图解过程

    (1)我们创建存放栈顶栈底指针的结构体(也就是栈的结构体),并动态创建一个结点作为栈底,栈底的指针域为空

     

    (2)初始状态下,栈顶指针(S.top)和栈底指针(S.bottom)都指向栈底

    2.2代码

    1. void initStack(PSTACK pS)
    2. {
    3. pS->pTop = (PNODE)malloc(sizeof(Node)); //动态生成一个结点,使得pTop指针指向它,pTop保存这个结点第一个字节的地址
    4. if (NULL == pS->pTop)
    5. {
    6. printf("dynamic memory is failed to allocate,procedure is over!\n");
    7. exit(-1);
    8. }
    9. else
    10. {
    11. pS->pBottom = pS->pTop; //让pBottom和pTop指向同一个结点
    12. pS->pBottom->pNext = NULL; // pS->pTop->pNext = NULL;令栈底的指针域为空
    13. }
    14. }

    3.压栈

    栈的操作只能在栈顶进行,所以重点是移动栈顶指针的位置,让S.Ptop指向栈顶元素

    3.1图解过程

    (1)动态生成一个结点pNew

    (2)pNew指向栈底,栈顶指针指向pNew

    (3)以此类推

       

    3.2代码

    1. void pushStack(PSTACK pS, int val)
    2. {
    3. PNODE pNew = (PNODE)malloc(sizeof(Node));
    4. pNew->data = val;
    5. pNew->pNext = pS->pTop; // pS->pTop不能改成pS->pBottom
    6. pS->pTop = pNew; // pTop指向pNew
    7. }

    4.出栈

    4.1.图解过程 

     出栈是压栈的逆过程,只需要将S.pTop指针下移,然后释放被删除节点的内存就可以

    4.2代码

    1. /把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中
    2. bool pop(PSTACK pS, int *pVal)
    3. {
    4. if (empty(pS))
    5. return false;
    6. else
    7. {
    8. PNODE r = pS->pTop;
    9. *pVal = r->data;
    10. pS->pTop = pS->pTop->pNext; // ps->pTop=r->pNext
    11. free(r);
    12. r = NULL;
    13. return true;
    14. }
    15. }

    5.栈的判空

    栈空的条件为,栈顶指针和栈底指针指向同一个存储单元

    1. bool empty(PSTACK pS)
    2. {
    3. if (pS->pBottom == pS->pTop)
    4. {
    5. return true;
    6. }
    7. else
    8. {
    9. return false;
    10. }
    11. }

    6.栈的遍历

    6.1图解过程

    1.定义一个结构体指针指向栈顶,和S.pTop指向同一个位置

    2.每读取一个元素就将p下移一次,直到p指向的节点的指针域为NULL

    6.2代码

    1. void traverse(PSTACK pS)
    2. {
    3. PNODE p;
    4. p = pS->pTop;
    5. cout << "stack's datas are:" << endl;
    6. while (p->pNext != NULL)
    7. {
    8. cout << p->data << endl;
    9. p = p->pNext;
    10. }
    11. }

     

     

  • 相关阅读:
    公司安防工程简要介绍及系统需求分析
    61-70==c++知识点
    阿里技术面总结
    第六章 数学(三)
    ESP8266-Arduino编程实例-MQ-135空气质量检测传感器驱动
    RHCE8 资料整理(六)
    淘宝、京东、苏宁、拼多多、1688各大电商API接口详情( API 返回值说明,数据分析)
    XAPP585框架详解-LVDS时钟恢复逻辑
    java面试100题(应届生必备)
    python 字符串类型
  • 原文地址:https://blog.csdn.net/weixin_46637351/article/details/126079863