数据结构-栈(C语言简单实现)

这篇具有很好参考价值的文章主要介绍了数据结构-栈(C语言简单实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

  • 栈是一种数据结构
  • 栈可以用来存放数字
  • 一次只能向栈里加入一个数字,一次也只能从栈里获得一个数字
  • 栈里到的数字有前后顺序,先进入到的数字在前,后进入的数字在后
  • 每次从栈里获取的数字一定是最后面的数字,最后获取的数字一定是最前面的数字
  • 这种取数字的方法叫先进后出,后进先出

下面是它存储数据的过程

数据结构-栈(C语言简单实现),C语言初阶学习,数据结构,数据结构,c语言,开发语言

下面是它取出这三个数据的过程

数据结构-栈(C语言简单实现),C语言初阶学习,数据结构,数据结构,c语言,开发语言

上面两幅图展示了栈存储数据和取出数据的一个过程,体现了先进后出,后进先出这个特性。

代码实现

以下就是创建栈的数据结构,并且实现其功能的相关函数。

  1. 定义栈
typedef struct stack{
    int *arr;  // 分配存储区的首地址
    int cap;  // 栈中的元素个数
    int top;  // 入栈和出栈的位置
}stack_t;
  1. 初始化栈
void stack_init(stack_t* pstack, int cap){
    pstack->arr = malloc(sizeof(int) * cap);  // 分配内存给存储区
    if(pstack->arr == NULL){
        printf("栈的存储区分配失败!\n");
        return;
    }
    pstack->cap = cap;  // 初始化传入的元素个数
    pstack->top = 0;  // 一开始入栈的索引是在0
}
  1. 释放栈
void stack_deinit(stack_t* pstack){
    // 释放内存,并重置为0和NULL
    free(pstack->arr);
    pstack->arr = NULL;
    pstack->cap = 0;
    pstack->top = 0;
}
  1. 压栈
void stack_push(stack_t* pstack, int data){
    // 将传入的数据放到栈中
    pstack->arr[pstack->top++] = data;  // 先将数据放入索引为top的位置,然后将top++,往后移
}
  1. 出栈
int stack_pop(stack_t* pstack){
    // 当栈中有数据时,此时top肯定是指向最后一个传进去的数据后一个,此时只需将top--,之后再将数据取出即可
    return pstack->arr[--pstack->top];
}
  1. 判断栈是否已满
int stack_full(stack_t* pstack){
    // 因为top索引是从0开始的,有一个数据进来,top就加1,所以top的值就是当前栈中元素的个数,当它等于cap时,说明栈满了
    return pstack->top >= pstack->cap;  // 满了返回真(非0),没满返回假(0)
}
  1. 判断栈是否为空
int stack_empty(stack_t* pstack){
    // 参考第6条,top的值就是当前栈中元素的个数,top值为0说明为空
    return pstack->top == 0;  // 为空返回真(非0),不为空返回假(0)
}
  1. 获取栈中的元素个数
int stack_size(stack_t* pstack){
    // 参考第6条,top的值就是当前栈中元素的个数
    return pstack->top;
}

实例代码

创建三个文件: stack.cstack.hmain.c文章来源地址https://www.toymoban.com/news/detail-637483.html

  • stack.c定义栈具体的函数
#include "stack.h"

// 初始化栈
void stack_init(stack_t* pstack, int cap){
    pstack->arr = malloc(sizeof(int) * cap);
    if(pstack->arr == NULL){
        printf("栈的存储区分配失败!\n");
        return;
    }
    pstack->cap = cap;
    pstack->top = 0;
}

// 释放栈
void stack_deinit(stack_t* pstack){
    free(pstack->arr);
    pstack->arr = NULL;
    pstack->cap = 0;
    pstack->top = 0;
}

// 压栈
void stack_pull(stack_t* pstack, int data){
    pstack->arr[pstack->top++] = data;
}

// 出栈
int stack_pop(stack_t* pstack){
    return pstack->arr[--pstack->top];
}

// 判断栈是否已满
int stack_full(stack_t* pstack){
    return pstack->top >= pstack->cap;
}

// 判断栈是否为空
int stack_empty(stack_t* pstack){
    return pstack->top == 0;
}

// 获取栈中的元素个数
int stack_size(stack_t* pstack){
    return pstack->top;
}
  • stack.h声明栈的相关函数和定义栈
#ifndef __STACK_H  // 头卫士
#define __STACK_H
#include <stdio.h>
#include <stdlib.h>

// 定义栈的数据结构
typedef struct stack{
    int* arr;
    int cap;
    int top;
}stack_t;

// 声明栈的函数
extern void stack_init(stack_t* pstack, int cap);
extern void stack_deinit(stack_t* pstack);
extern void stack_pull(stack_t* pstack, int data);
extern int stack_pop(stack_t* pstack);
extern int stack_full(stack_t* pstack);
extern int stack_empty(stack_t* pstack);
extern int stack_size(stack_t* pstack);
#endif
  • main.c主函数使用栈
#include "stack.h"

int main(void){
    // 1. 声明一个栈: stack
    stack_t stack;

    // 2. 初始化stack
    stack_init(&stack, 5);

    // 3. 将栈放满数据
    int data = 100;
    printf("开始放入数据: ");
    while(!stack_full(&stack)){
        // 没满的状态下,放入数据
        printf("%d ", data);
        stack_pull(&stack, data++);
    }
    printf("结束!\n");
    printf("此时栈中元素个数为: %d\n\n", stack_size(&stack));

    // 4. 将栈中的数据一个个取出来
    printf("开始取出数据: ");
    while(!stack_empty(&stack)){
        // 非空的状态,取数据
        data = stack_pop(&stack);
        printf("%d ", data);
    }
    printf("结束!\n");
    printf("此时栈中元素个数为: %d\n\n", stack_size(&stack));

    // 5. 释放栈
    stack_deinit(&stack);
    return 0;
}

到了这里,关于数据结构-栈(C语言简单实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构初阶之基础二叉树(C语言实现)

    📃 博客主页: 小镇敲码人 💞 热门专栏:数据结构与算法 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 什么

    2024年03月19日
    浏览(38)
  • 【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客  

    2024年02月08日
    浏览(38)
  • 【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客  =======================================

    2024年02月08日
    浏览(39)
  • 『初阶数据结构 • C语言』⑫ - 堆的概念&&实现(图文详解+完整源码)

    目录 0.写在前面 1.什么是堆? 2.堆的实现 2.1 堆的结构定义 2.2 函数声明 2.3 函数实现 2.3.1 AdjustUp(向上调整算法) 2.3.2 AdjustDown(向下调整算法) 2.3.3 HeapCreate(如何建堆) 2.3.4 建堆的时间复杂度 3. 完整源码 Heap.h文件 Heap.c文件  Test.c文件  上一章中介绍了树和二叉树的概念

    2024年02月16日
    浏览(44)
  • 『初阶数据结构 • C语言』⑩ - 栈的概念与实现(附完整源码)

        栈存储数据的方式跟数组一样,都是将元素排成一行。只不过它还有以下 3 条约束。   ● 只能在末尾插入数据。   ● 只能读取末尾的数据。   ● 只能移除末尾的数据。 你可以将栈看成一叠碟子:你只能看到最顶端那只碟子的碟面,其他都看不到。另外,要加碟子只能

    2024年02月16日
    浏览(47)
  • 『初阶数据结构 • C语言』⑩ - 队列的概念与实现(附完整源码)

        队列对于临时数据的处理也十分有趣,它跟栈一样都是有约束条件的数组(或者链表)。区别在于我们想要按什么顺序去处理数据,而这个顺序当然是要取决于具体的应用场景。 你可以将队列想象成是电影院排队。排在最前面的人会最先离队进入影院。套用到队列上,就

    2024年02月15日
    浏览(36)
  • 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】六、线性表中的队列(链式结构实现队列)-CSDN博客  ===========================

    2024年02月08日
    浏览(42)
  • 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表 -- C语言实现)_高高的胖子的博客

    2024年02月08日
    浏览(40)
  • 【数据结构初阶】四、线性表里的链表(带头+双向+循环 链表 -- C语言实现)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】三、 线性表里的链表(无头+单向+非循环链表 -- C语言实现)-CSDN博客  ====

    2024年02月08日
    浏览(38)
  • 【数据结构初阶】八、非线性表里的二叉树(二叉树的实现 -- C语言链式结构)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)-CSDN博客  ==========

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包