zoukankan      html  css  js  c++  java
  • 链式栈总结

    基本数据结构之—链式栈

    链式栈-其实简单的理解就是一个受到操作限制的单向链表,因为栈只有简单的一些操作,比如:入栈,出栈,获取栈顶,栈的清空等

    先分析一下栈的基本数据吧

    栈作为一种容器,那么需要存储数据的地方,为了方便,只存储数据的开始地址是一个不错的选择

    为了快速的知道栈的长度,我们在维护一个长度的参数,和顺序栈的区别是我们不用考虑容量的问题

    当然你也可以维护更多的参数来支持你想要的操作。

    栈的链式存储,底部使用的是链表的知识。为了方便操作和提升性能,我们将链表的头结点当做栈顶。

    为了有个统一的结点来传递地址,直接定义一个指针

    typedef struct _STACKNODE

    {

        struct _STACKNODE *Next;

    }StackNode;

    栈的基本结构

     

    typedef struct _LINKSTACK

    {

        // 栈的数据(其实是地址)

        StackNode Head;

        // 栈的长度

        int Size;

    }LinkStack;

    先判断现在栈的结点的情况,如果为空,则开辟一个空间。

    //初始化

    int Init_LinkStack(void **linkstack)

    {

        if (linkstack == NULL)

        {

            exit(-1);

        }

     

        // 将数据类型进行转化,便于后面的操作

        LinkStack **stack = (LinkStack **)linkstack;

       

        // 检查栈是否已经有可用的内存

        if (*stack == NULL)

        {

            *stack = (LinkStack *)malloc(sizeof(LinkStack));

        }

        // 对开辟空间的检测

        if (*stack == NULL)

        {

            exit(-2);

        }

       

        // 将数据和长度初始化

        (*stack)->Head.Next = NULL;

        (*stack)->Size = 0;

     

        return 0;

    }

     

    入栈操作就是将数据的头指针的数据 (地址)和加入数据(地址)做一个交换

    // 入栈

    int Push_LinkStack(void *linkstack, void *Data)

    {

        if (linkstack == NULL)

        {

            return -1;

        }

        if (Data == NULL)

        {

            return -2;

        }

     

        // 将数据类型进行转化,便于后面的操作

        LinkStack *stack = (LinkStack *)linkstack;

        StackNode *data = (StackNode *)Data;

       

        data->Next = stack->Head.Next;

        stack->Head.Next = data;

        ++stack->Size;

     

        return 0;

    }

     

    将第一个位置的元素指向下一个位置,如果长度为0,就不操作

    // 出栈

    int Pop_LinkStack(void *linkstack)

    {

        if (linkstack == NULL)

        {

            return -1;

        }

        // 将数据类型进行转化,便于后面的操作

        LinkStack *stack = (LinkStack *)linkstack;

       

        // 栈为空,不能出栈

        if (stack->Size == 0)

        {

            return -2;

        }

        else

        {

            stack->Head.Next = stack->Head.Next->Next;

            --stack->Size;

        }

        return 0;

    }

     

    // 返回栈顶元素

    void *Top_LinkStack(void *linkstack)

    {

        if (linkstack == NULL)

        {

            return NULL;

        }

        // 将数据类型进行转化,便于后面的操作

        LinkStack *stack = (LinkStack *)linkstack;

     

        // 栈为空,不能出栈

        if (stack->Size == 0)

        {

            return NULL;

        }

        // 返回第一个元素

        return stack->Head.Next;

    }

     

    栈的大小

    int Size_LinkStack(void *linkstack)

    {

        if (linkstack == NULL)

        {

            return 0;

        }

        // 将数据类型进行转化,便于后面的操作

        LinkStack *stack = (LinkStack *)linkstack;

        return stack->Size;

    }

     

    // 销毁栈

    int Destory_LinkStack(void *linkstack)

    {

        if (linkstack == NULL)

        {

            return -1;

        }

        // 将数据类型进行转化,便于后面的操作

        LinkStack *stack = (LinkStack *)linkstack;

     

        if (stack->Head.Next != NULL)

        {

            stack->Head.Next = NULL;

        }

        stack->Size = 0;

        return 0;

    }

  • 相关阅读:
    如何让呼吸机用得更好:4款最好用的鼻枕面罩
    睡眠呼吸机的保养步骤
    干货!科学调整桌椅键盘高度和显示器距离,告别办公疲劳!
    羽绒服的选择标准
    为什么有些羽绒服穿一季就不暖和了?
    不想加班开发管理后台了,试试这个 Java 开源项目吧!
    HelloGitHub 月刊最受欢迎的开源项目 Top10(2020 年)
    SonarQube学习(四)- 使用Jenkins集成JaCoCo和SonarQube检查代码测试覆盖率
    解决 Jenkins 安装插件很慢的问题 ( Linux )
    Docker学习(二)- Docker 安装 Jenkins
  • 原文地址:https://www.cnblogs.com/bkcarlos/p/5928512.html
Copyright © 2011-2022 走看看