【数据结构】栈(C语言实现)


📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持


请添加图片描述


  • 1.栈
    • 1.1栈的概念及结构
    • 1.2栈的实现
      • 1.2.1 Stack.h
      • 1.2.2 Stack.c
        • 初始化
        • 入栈
        • 出栈
        • 获取栈顶元素
        • 获取栈中有效元素个数
        • 判空
        • 销毁
    • 1.3 源代码
      • Stack.h
      • Stack.c

1.栈

1.1栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。
这里有一张学长做的图片,我们借鉴来看一下
在这里插入图片描述
在这里插入图片描述


1.2栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

在这里插入图片描述
在这里插入图片描述
我们接下来将整个栈的函数体实现出来
分为三个文件:

  1. Stack.h (函数头和函数体)
  2. Stack.c (功能具体实现)
  3. Test.c (功能测试)

1.2.1 Stack.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>// 下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
//typedef int STDataType;
//#define N 10
//typedef struct Stack
//{
//	STDataType a[N];
//	int top; // 栈顶
//}Stack;// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity; 
}ST;// 初始化栈
void STInit(ST* ps);// 入栈
void STPush(ST* ps, STDataType x);// 出栈
void STPop(ST* ps);// 获取栈顶元素
STDataType STTop(ST* ps);// 获取栈中有效元素个数
int STSize(ST* ps);// 检测栈是否为空
bool STEmpty(ST* ps);// 销毁栈
void STDestroy(ST* ps);

1.2.2 Stack.c

初始化

我们将队列中容量和个数都置为0,将存储数值的指针变量a置为空

void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

入栈
void STPush(ST* ps, STDataType x)
{assert(ps);       //先断言判断是否为空if (ps->top == ps->capacity)       //如果存储的值个数和容量相等{int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2 ;     //容量为0则置为4,不为0则置为原容量的两倍STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);    //开辟新空间if (tmp == NULL){perror("realloc fail");exit(-1);}ps->a = tmp;ps->capacity = newCapacity;}ps->a[ps->top] = x;ps->top++;   //数值增加了一个
}

出栈
void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);--ps->top;
}

获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}

获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

判空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

销毁
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}

1.3 源代码

Stack.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>下面是定长的静态栈的结构,实际中一般不实用,所以我们主要实现下面的支持动态增长的栈
//typedef int STDataType;
//#define N 10
//typedef struct Stack
//{
//	STDataType a[N];
//	int top; // 栈顶
//}Stack;typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity; 
}ST;void STInit(ST* ps);
void STDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
STDataType STTop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);

Stack.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2 ;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}ps->a = tmp;ps->capacity = newCapacity;}ps->a[ps->top] = x;ps->top++;
}
void STPop(ST* ps)
{assert(ps);assert(ps->top > 0);--ps->top;
}
STDataType STTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}
int STSize(ST* ps)
{assert(ps);return ps->top;
}
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

最后的Test可以自由发挥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139124.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python每日一练(9)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

SpringBoot实现SSMP整合

一、整合JUnit 1、Spring 整合 JUnit 核心注解有两个&#xff1a; RunWith(SpringJUnit4ClassRunner.class) 是设置Spring专用于测试的类运行器&#xff08;Spring程序执行程序有自己的一套独立的运行程序的方式&#xff0c;不能使用JUnit提供的类运行方式&#xff09;Conte…

CICD:Circle CI 实现CICD

持续集成解决什么问题 提高软件质量效率迭代便捷部署快速交付、便于管理 持续集成&#xff08;CI&#xff09; 集成&#xff0c;就是一些孤立的事物或元素通过某种方式集中在一起&#xff0c;产生联系&#xff0c;从而构建一个有机整体的过程。 持续&#xff0c;就是指长期…

【k8s总结】

资源下载&#xff1a;http://www.ziyuanwang.online/912.html Kubernetes(K8s) 一、Openstack&VM 1、认识虚拟化 1.1、什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的…

网工记背配置基本命令(5)----SNMP配置

目录 1.配置设备使用SNMPv1与网管通信 2.配置设备SNMPv2与网管通信 3.配置设备使用SNMPv3与网管通信 1.在大型网络中&#xff0c;设备发生故障时&#xff0c;由于设备无法主动上报故障&#xff0c;导致网络管理员无法及时感知、及 时定位和排除故障&#xff0c;从而导致网络…

centos离线安装telnet、traceroute工具

安装包下载地址 安装包下载地址在这里 直接输入包名&#xff0c;筛选系统&#xff0c;根据自己系统版本确定该下哪个包 centos离线安装telnet 准备三个安装包 xinetd-2.3.15-14.el7.x86_64.rpmtelnet-server-0.17-65.el7_8.x86_64.rpmtelnet-0.17-65.el7_8.x86_64.rpm 三个…

HTML 基础知识

HTML 基础知识 1.列表2.表格3.表单4.语义化5.字符实体 1.列表 2.表格 3.表单 4.语义化 5.字符实体

学习mapster的基本用法

正在学习的开源博客项目Blog .NET Core中采用mapster实现对象映射&#xff0c;个人理解对象映射框架主要用于不同类型间的数据转换&#xff0c;比起个人实现的定制化的类型对类型的转换代码&#xff0c;采用对象映射框架更便捷&#xff0c;同时也能支撑各式各样的对象映射场景。…

毫米波雷达与其他传感器的协同工作:传感器融合的未来

随着科技的不断进步&#xff0c;传感技术在各个领域的应用愈发广泛。毫米波雷达作为一种重要的传感器技术&#xff0c;以其高精度、强穿透力和适应性强等优点&#xff0c;在军事、医疗、汽车、工业等领域都得到了广泛应用。然而&#xff0c;单一传感器的局限性也逐渐显现&#…

用GDB调试程序的栈帧

2023年10月17日&#xff0c;周二晚上 目录 练习GDB栈帧调试功能的程序 GDB栈帧方面的指令 调试效果 练习GDB栈帧调试功能的程序 斐波那契数列 #include <iostream>int factorial(int n) {if (n < 1) {return 1;} else {return n * factorial(n - 1);} }int main(…

力扣刷题 day47:10-17

1.位1的个数 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 方法一&#xff1a;逐个判断 利用n&1 #方法一&#xff1a;逐个…

C++项目实战——基于多设计模式下的同步异步日志系统-⑫-日志宏全局接口设计(代理模式)

文章目录 专栏导读日志宏&全局接口设计全局接口测试项目目录结构整理示例代码拓展示例代码 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;C…