数据结构-栈的实现(C语言版)

前言

        栈是一种特殊的线性表,只允许在固定的一端进行插入和删除的操作,进行数据插入和删除的一端叫做栈顶,另一端叫做栈底。 栈中的数据元素遵循后进先出的的原则。

目录

1.压栈和出栈

2. 栈的实现

3.测试代码


1.压栈和出栈

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

        弹栈:栈的删除操作叫做出栈。出数据也在栈顶。

        如图:

 

2. 栈的实现

         //stack.h

#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<stdbool.h>
typedef int SDataType;
typedef struct Stack
{SDataType* _a;int _top;//栈顶数据int _capacity;//容量
}Stack;
void StackInit(Stack* st);//初始化栈
void StackDestory(Stack* st);//销毁栈
void StackPush(Stack* st, SDataType data);//入栈
void StackPop(Stack* st);//出栈size_t StackSize(Stack* st);//获取栈中元素的数目SDataType StackTop(Stack* st);//获取栈顶元素bool StackEmpty(Stack* st);//判断栈是否为空

//stack.c

void StackInit(Stack* st)//初始化栈
{st->_a = (SDataType*)malloc(sizeof(SDataType) * 4);//申请空间//初始化数据st->_capacity = 4;st->_top = 0;
}
void StackDestory(Stack* st)//销毁栈
{free(st->_a);//释放空间st->_capacity = st->_top = 0;
}
void StackPush(Stack* st, SDataType data)//入栈
{assert(st);//判断指针是否存在if (st->_capacity == st->_top){//空间满了需要增容st->_capacity *= 2;SDataType* p = (SDataType *)realloc(st->_a, st->_capacity * sizeof(SDataType));if (p == NULL){printf("内存不足\n");exit(-1);}st->_a = p;}st->_a[st->_top] = data;++(st->_top);
}
void StackPop(Stack* st)//出栈
{assert(st);//确保指针存在assert(st->_top > 0);--(st->_top);
}
size_t StackSize(Stack* st)//获取栈中元素的数目
{assert(st);//确保指针存在size_t size = 0;return size = st->_top;
}
SDataType StackTop(Stack* st)//获取栈顶元素
{return st->_a[(st->_top) -1 ];
}
bool StackEmpty(Stack* st)//判断栈是否为空
{return !st->_top;
}

3.测试代码

void TestStack()
{Stack st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);StackPush(&st, 5);StackPush(&st, 6);StackPush(&st, 7);StackPush(&st, 8);while (!StackEmpty(&st)){printf("%d ", StackTop(&st));StackPop(&st);}StackDestory(&st);
}

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

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

相关文章

C语言学习之函数的返回值

函数的返回值&#xff1a;所有函数的返回值都是通过return关键字返回的&#xff1b;返回一个基本类型的值&#xff1a;案例&#xff1a; int my_mod(int x,int y){return x % y;}返回一个地址&#xff1a;案例&#xff1a; int *func(int *p){return p;}返回全局变量的地址&a…

k8s 滚动更新控制(一)

在传统的应用升级时&#xff0c;通常采用的方式是先停止服务&#xff0c;然后升级部署&#xff0c;最后将新应用启动。这个过程面临一个问题&#xff0c;就是在某段时间内&#xff0c;服务是不可用的&#xff0c;对于用户来说是非常不友好的。而kubernetes滚动更新&#xff0c;…

数据库的相关

ACID 事务的四大特性主要是&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&#xff08;Durability&#xff09;。 原子性&#xff08;Atomicity&#xff09; 原子性是…

【数据结构】二叉树篇| 纲领思路01+刷题

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 所谓自由&#xff0c;不是随心所欲&#xff0c;而是自我主宰。——康德 目录 一、二叉树刷题纲领二、刷题1、104. 二叉树的最大深度2、 二叉…

react进阶

react-virtualized的高阶组件&#xff0c;Autosize可以使屏幕适配。使用render-props模式来获取到AutoSizer组件暴露的width和height属性。JSON.parse(JSON.stringify())不适用于有undefined的数据。 深拷贝的使用&#xff0c;不能使用在有undefined的数据中。有直接过滤undefi…

jacoco功能测试-代码覆盖率

1、下载 jacoco 官网地址&#xff1a;EclEmma - JaCoCo Java Code Coverage Library 2、拷贝 jar 包 下载好后&#xff0c;找到这两个文件&#xff0c;然后找到被测项目 3、启动 jacocoagent&#xff0c;监控被测项目 java -javaagent:jacocoagent.jarincludes*,outputtcp…

【Java】异常处理 之 使用Log4j

使用 Log4j 前面介绍了Commons Logging&#xff0c;可以作为“日志接口”来使用。而真正的“日志实现”可以使用Log4j。 Log4j是一种非常流行的日志框架&#xff0c;最新版本是2.x。 Log4j是一个组件化设计的日志系统&#xff0c;它的架构大致如下&#xff1a; log.info(&q…

linux0.95(VFS重点)源码通俗解读(施工中)

文件系统在磁盘中的体现 下面是磁盘的内容&#xff0c;其中i节点就是一个inode数组&#xff0c;逻辑块就是数据块可用于存放数据 操作系统通过将磁盘数据读入到内存中指定的缓冲区块来与磁盘交互&#xff0c;对内存中的缓冲区块修改后写回磁盘。 进程(task_struct * task[N…

Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?

索引所占空间的增长确实会对MySQL数据库的写入性能和查询性能造成影响&#xff0c;这主要是由于索引数据过多时会导致磁盘I/O操作变得非常频繁&#xff0c;从而使性能下降。为此&#xff0c;可以采取以下几种方式来减缓这种影响&#xff1a; 1. 限制索引的大小&#xff1a;可以…

Netty框架技术文档-基本概念

Netty: Home https://github.com/netty/netty 基本概念 NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞I/O&#xff09;&#xff1a;NIO是一种Java平台的I/O模型&#xff0c;它使用Channel和Buffer来进行数据传输&#xff0c;而不是传统的Stream。NIO模型可以处理大量并…

TCP除了3次握手,其他的这些你知道吗?

文章首发地址 MSS&#xff1a; MSS&#xff08;Maximum Segment Size&#xff09;表示TCP报文段的最大长度&#xff0c;通常是MSSMTU-TCP头部长度。由于数据链路层协议的MTU可能不同&#xff0c;因此TCP连接建立时会通过MSS选项告知对方报文段的最大长度。MTU&#xff1a; MTU…

【探索SpringCloud】服务发现-Nacos使用

前言 在聊服务注册中心时&#xff0c;便提到了Nacos。这次便来认识一下。当然&#xff0c;这自然没有官方介绍那般详尽&#xff0c;权当是学习了解Nacos原理的一个过程吧。 Nacos简介 Nacos&#xff0c;全名&#xff1a;dynamic Naming And Configuration Service. 而这个名…

Java JDBC,轻松构建数据库连接:代码教程详解

JDBC的概述 Java Database Connectivity&#xff08;JDBC&#xff09;是 Java 中用于与数据库进行通信的 API。它提供了一套标准的 API&#xff0c;并允许 Java 应用程序连接到各种关系型数据库&#xff0c;如 MySQL、Oracle、PostgreSQL 等&#xff0c;从而可以执行 SQL 查询…

win10在vmware15中安装macos10.13系统

第一步、安装vmware版本信息如下 第二步、下载unlocker-main和darwin.iso放到安装文件夹 第三步、管理员身份运行win-install.cmd 第四步、运行vmware新建虚拟机 第五步、启动新创建的虚拟机macOS 10.13并选择语言 第六步、选择磁盘工具抹掉磁盘 第七步、格式化完成后退出磁盘工…

flutter 随笔

万物 皆可 结构 概念 ⽆状态 插件类 flutter系统类 MaterialApp源App应⽤ 事件 很简单/简单/较复杂/复杂/很复杂 结构体 MaterialApp(xx:) 公开坑位属性&#xff1a;所配置内容 Widget 插件事件 function 函数事件 flutter/dart 事件结构描述void Function() 外层主事件 内层回…

数据结构:交换排序

冒泡排序 起泡排序&#xff0c;别名“冒泡排序”&#xff0c;该算法的核心思想是将无序表中的所有记录&#xff0c;通过两两比较关键字&#xff0c;得出升序序列或者降序序列。 算法步骤 比较相邻的元素。如果第一个元素大于第二个元素&#xff0c;就交换它们。对每一对相邻…

Python-OpenCV中的图像处理-图像金字塔

Python-OpenCV中的图像处理-图像金字塔 图像金字塔高斯金字塔拉普拉斯金字塔 金字塔图像融合 图像金字塔 同一图像的不同分辨率的子图集合&#xff0c;如果把最大的图像放在底部&#xff0c;最小的放在顶部&#xff0c;看起来像一座金字塔&#xff0c;故而得名图像金字塔。cv2…

小程序发布注意事项

1、使用HBuildx的 发布 功能发布小程序&#xff0c;因为编译完的代码目录不是同一个 如果使用 运行 到小程序&#xff0c;最后发布的版本会显示”无法连接本地服务器“ 2、使用unicloud的云服务 uniCloud发行 | uni-app官网 阿里云的unicloud的话&#xff0c;使用request域名…

Spring中Bean的循环依赖问题

1.什么是Bean的循环依赖&#xff1f; 简单来说就是在A类中&#xff0c;初始化A时需要用到B对象&#xff0c;而在B类中&#xff0c;初始化B时需要用到A对象&#xff0c;这种状况下在Spring中&#xff0c;如果A和B同时初始化&#xff0c;A&#xff0c;B同时都需要对方的资源&…

电脑开机出现Boot Device怎么办?

开机出现Boot Device这个问题很常见&#xff0c;有时还会出现No Boot Device的问题&#xff0c;虽然多了一个单词&#xff0c;但意思是相同的&#xff0c;这些问题说明你的系统盘出现了问题&#xff0c;或者是引导出现了问题。这该如何解决呢&#xff1f; 方法1. 检查主板或硬盘…