ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构10分钟入门--栈

2022-09-08 12:30:47  阅读:216  来源: 互联网

标签:node 10 head -- next 节点 数据结构 data stack


一、栈是什么

栈是一种后进先出(Last In First Out, LIFO)的线性表,限定只能在表尾进行插入或者删除操作,表尾又称为栈顶。栈可分为顺序栈(使用数组实现)和链式栈(使用链表实现)两种类型,本章主要介绍链式栈。

栈常用的操作有入栈和出栈两种,在表尾插入元素称为入栈(push),在表尾删除元素称为出栈(pop)

二、栈的结构体定义

typedef struct node {
    int data;     /**数据域*/
    struct stack_node *next;    /**指向下一个节点*/
}stack_node;

可以看到,栈的结构体定义与上篇文章单链表完全一致,因为链式栈就是以链表为基础进行实现的。

三、创建栈

stack_node *stack_init()
{
    /**从内存动态申请*/
    stack_node *head = (stack_node *)malloc(sizeof(stack_node));
    if(head == NULL) {
        return NULL;
    }

    /**初始化头指针 #2*/
    head->data = 0; /**头指针的数据域用于存储栈的大小*/
    head->next = NULL;
   
    return head;
}

1、创建栈的函数与创建单链表一致,动态从内存申请空间,作为栈的头指针,然后对malloc的返回值进行判断;

2、特别注意的是我们将头指针的数据域data用来存储栈的元素总数;

三、入栈

int stack_push(stack_node *head, int data)
{
    /**动态申请一个节点*/
    stack_node *node = (stack_node *)malloc(sizeof(stack_node));
    if (node == NULL) {
        return -1;
    }

    /**插入节点 */
    node->data = data;
    node->next = head->next;

    head->next = node;

    /**栈大小加1*/
    head->data++;
    return 0;
}

入栈操作就是单链表插入节点的特殊形式,即只能将节点插入在表尾,所以入栈函数的传参没有节点插入位置(固定插入在第一个节点),省略了遍历链表寻找插入位置节点的操作。

四、出栈

int stack_pop(stack_node *head)
{
    /* 临时保存栈顶元素 */
    stack_node *p = head->next;
    if (p == NULL) {
        return -1;
    }

    int data = p->data;
    /**跳过被删除的节点,释放内存,完成出栈*/
    head->next = head->next->next;
    free(p);

    /**栈大小减1*/
    head->data++--;
    return data;
}

出栈操作同样为单链表删除节点的特殊形式,即只能将表尾的第一个节点删除,最后返回被删除节点的值,即为弹出的的意思。

五、释放栈

int stack_release(stack_node *head)
{
    stack_node *current, *next;
    int size = head->data;
    if (size <= 0 ) {
        return -1;
    }

    current = head->next;
    while (size--)
    {
        next = current->next;
        free(current);
        current = next;
    }

    /**释放头指针*/
    head->data = 0;
    head->next =NULL;
    free(head);
    return 0;
}

六、测试

目录结构
./
├── build               //编译目录
├── CMakeLists.txt      //cmake 配置文件
├── stack.c             //源码
├── stack.h
└── test.c              //测试文件

工程采用cmake构建,文件均经过测试,编译步骤如下:

1、mkdir build && cd build

2、cmake ../ && make

3、./stack_test

源码地址在公众号同标题文章底部,公众号:Linux杂货铺

系列文章

[数据结构10分钟入门] 面向初学者从零实现 -- 单链表

标签:node,10,head,--,next,节点,数据结构,data,stack
来源: https://www.cnblogs.com/linux-misc/p/16663661.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有