数据结构 | 栈的实现
数据结构 | 栈的实现
文章目录
- 数据结构 | 栈的实现
- 栈的概念及结构
- 栈的实现
- Stack.h
- 初始化栈
- 入栈
- 出栈
- 获取栈顶元素
- 获取栈中有效元素个数
- 检测栈是否为空
- 销毁栈
- Stack.c
栈的概念及结构
- 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出
LIFO(Last In First Out)的原则。 - 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
- 出栈:栈的删除操作叫做出栈。出数据也在栈顶。


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


Stack.h
#pragma once#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;// 初始化栈
void StackInit(ST* ps);
// 入栈
void StackPush(ST* ps, STDataType x);
// 出栈
void StackPop(ST* ps);
// 获取栈顶元素
STDataType StackTop(ST* ps);
// 获取栈中有效元素个数
int StackSize(ST* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(ST* ps);
// 销毁栈
void StackDestroy(ST* ps);
Stack.c
初始化栈
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}
入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);if (ps->capacity == ps->top){STDataType newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("relloc fail!\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}
出栈
void StackPop(ST* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}
获取栈顶元素
STDataType StackTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}
获取栈中有效元素个数
int StackSize(ST* ps)
{assert(ps);return ps->top;
}
检测栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
销毁栈
void StackDestroy(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}
Stack.c
#define _CRT_SECURE_NO_WARNINGS 1#include"Stack.h"// 初始化栈
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;//top 表示指向栈顶元素//ps->top = -1;//top 表示指向栈顶元素的下一个ps->top = 0;
}
// 入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);if (ps->capacity == ps->top){STDataType newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);if (tmp == NULL){perror("relloc fail!\n");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}
// 出栈
void StackPop(ST* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}
// 获取栈顶元素
STDataType StackTop(ST* ps)
{assert(ps);assert(ps->top > 0);return ps->a[ps->top - 1];
}
// 获取栈中有效元素个数
int StackSize(ST* ps)
{assert(ps);return ps->top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
// 销毁栈
void StackDestroy(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}
好了,栈的实现就到这里结束了,有用的话点个赞吧~~
相关文章:
数据结构 | 栈的实现
数据结构 | 栈的实现 文章目录 数据结构 | 栈的实现栈的概念及结构栈的实现 Stack.h初始化栈入栈出栈获取栈顶元素获取栈中有效元素个数检测栈是否为空销毁栈 Stack.c 栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。…...
python异常、模块与包
1.异常 异常:当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。 1.1捕获异常 基本语法: try:可能发生错误代码 except:如果出现…...
虚拟内存和物理内存
虚拟内存的概念 虚拟内存是计算机系统内存管理的一种技术,它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储…...
FCA例题
Part.1:判断题 第1题 智能运维-负载管理中,实时负载通过使用图表直观的展示当前系统的最多最近半小时内存利用率和CPU利用率(正确) 第2题 服务器安装插件支持热部署,安装、删除、更新、禁用、启用不需要重启(正确) 第3题 次级管理员可新建…...
mysql使用GROUP BY归组后把所有记录id汇总到一个字段中
可以使用MySQL的GROUP_CONCAT函数来实现将归组后的记录的ID汇总到一个字段中。假设有一个名为table1的表,其中包含id和name两个字段,可以使用以下查询: SELECT name, GROUP_CONCAT(id) AS ids FROM table1 GROUP BY name;这将返回一个结果集…...
Vue3 使用Element Plus表格单选带checkbox
官方地址:添加链接描述 官方给出的多选带checkbox,单选直接选中当前行高亮,有时候不想要单行高亮,想要带checkbox的单选,需要对多选进行改造 官方给的多选例子: <template><el-tableref"mult…...
IOC - 自定义IOC容器
1、定义接口与实现类 // Service接口 public interface Service {void execute(); } // Service的实现类 public class MyService implements Service {Overridepublic void execute() {System.out.println("MyService 执行了.");} }2、自定义ioc容器以绑定接口与实…...
力扣第647题 回文子串 c++ 动态规划 双指针 附Java代码 注释解释版
题目 647. 回文子串 中等 相关标签 字符串 动态规划 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串…...
【Go入门】struct类型
【Go入门】struct类型 struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型person代表一个人的实体。这个实体拥有属性:姓名和年龄。这样…...
怎么改变容易紧张的性格?
容易紧张的性格是比较通俗的说法,在艾森克人格测试中,容易紧张的性格就属于神经症人格,神经质不是神-经-病,而是一种人格特征,这种特征包括:敏感,情绪不稳定,易焦虑和紧张。有兴趣的…...
合作共赢 共克时艰
采访人:最近财政部11月6日通报隐性债务问责典型案例,这中间涉及湖北多所重要地市,形成新增隐性债务200多亿,您怎么看这件事? 辜渝傧:是的,无论是数字还是涉及的范围都可以明显感觉到“防范…...
VCSA7许可证过期问题
公司两台ESXI7虚拟化系统,使用VCSA7进行日常管理,在使用过程中一直清单中包含过期或即将过期的许可证。 查看许可证清单中,已经添加了正式授权的许可证,且已经分配给了ESXI主机,但是任然有到期提示。 最后查看试用许可…...
解决win11更新后,文件夹打不开的bug
更新win11系统了,给我更了个bug,找了好多解决方案,发现下面这个可以解决问题。 第一步 找到注册表 第二步 备份注册表 为了防止意外情况,备份注册表。如有意外问题,可以导入导出的注册表进行恢复。 第三步 删除指定…...
修复了数个Bug!
v2.0.1版本已经在 github release 了,欢迎大家体验使用,开源版是永久免费的。 ## 新增与优化的功能 新增(测试报告): 测试报告根据测试执行详情,进行查看 新增(用户设置): 用户权限为普通用户和管理员,普通用户根据设置的默认产品…...
设计模式之--原型模式(深浅拷贝)
原型模式 缘起 某天,小明的Leader找到小明:“小明啊,如果有个发简历的需求,就是有个简历的模板,然后打印很多份,要去一份一份展示出来,用编程怎么实现呢?” 小明一听,脑袋里就有了…...
Linux服务器从零开始训练 RT-DETR 改进项目 (Ultralytics) 教程,改进RTDETR算法(包括使用训练、验证、推理教程)
手把手从零开始训练 RT-DETR 改进项目 (Ultralytics版本) 教程,改进RTDETR算法 本文以Linux服务器为例:从零开始使用Linux训练 RT-DETR 算法项目 《芒果剑指 RT-DETR 目标检测算法 改进》 适用于芒果专栏改进RT-DETR算法 文章目录 百度 RT-DETR 算法介绍改进网络代码汇总第…...
矩阵理论--矩阵分解
矩阵理论–矩阵分解 矩阵的三角分解、谱分解、最大秩分解、奇异值分解的操作步骤,以及相关说明。 1、QR分解 (1)非奇异方阵 方阵(非奇异):将方阵分解成酉矩阵左乘正线上三角,或者酉矩阵右乘…...
go语言相关bug
第一个bug itcastitcast:/home/jian/share/src/go-test/homeweb-client$ go mod tidy go: finding module for package github.com/micro/go-grpc go: found github.com/micro/go-grpc in github.com/micro/go-grpc v1.0.1 go: homeweb-client/handler importsgithub.com/micr…...
Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用 Spring Cloud OpenFeign是一个声明式的服务调用框架,基于Feign并整合了Ribbon和…...
租用服务器带宽类型应用
服务器带宽类型多样,以满足不同行业的需求。本文将介绍香港常见的服务器带宽类型及其应用领域。 1. 共享带宽 共享带宽是指多个用户共同使用同一台服务器的带宽资源。这种带宽类型适用于小型企业或个人网站,因为其成本较低。由于多个用户共享带宽资源&…...
【Kali Linux】 2026.1 新功能详解
2026年3月24日发布,基于 2025.4 的更新,带来全新视觉体验和多项新工具!🎨 2026 年度主题更新每年惯例的主题大换血,覆盖全流程:组件更新内容引导动画修复了实时镜像卡在第一帧的问题,循环更流畅…...
MeteorSeed赐
这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts imp…...
基于WRF-DNN融合的气象数据降尺度技术实践与优化
1. 气象数据降尺度为什么需要WRF和DNN联手? 每次打开天气预报App查看未来几天的温度变化时,你可能不会想到背后需要处理TB级的气象数据。专业领域使用的WRF模型就像个严谨的老教授,擅长用物理公式推演天气变化,但有个致命弱点——…...
小团队福音:用两台服务器搞定Redis高可用(Keepalived+互为主从配置)
小团队福音:用两台服务器构建轻量级Redis高可用架构 在初创公司和小型技术团队中,服务器资源往往捉襟见肘。当业务需要Redis作为缓存或数据库时,传统的高可用方案如哨兵模式需要至少三台服务器,这对资源有限的团队来说可能过于奢侈…...
OpenPLC Editor:重新定义工业自动化编程的开源解决方案
OpenPLC Editor:重新定义工业自动化编程的开源解决方案 【免费下载链接】OpenPLC_Editor 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPLC_Editor 在工业自动化领域,传统PLC编程软件往往面临高昂的授权费用、封闭的生态系统和有限的技术支…...
CMake实战:如何自动生成带Git分支和编译时间的版本号(附完整代码)
CMake实战:自动化生成含Git分支与编译时间的版本标识系统 在持续集成和敏捷开发成为主流的今天,每次代码提交都可能触发自动化构建流程。作为开发者,你是否遇到过这样的困扰:测试人员报告了一个问题,但无法快速确认他们…...
财税合规数字化建设与税务师事务所行业实践
随着企业监管趋严与数字化不断深入,财税合规已成为企业经营管理中的重要环节。无论是中小企业还是集团公司,都需要建立规范的财务流程,完善纳税申报机制,强化风险自查能力,以实现合法合规,稳定经营。财税合…...
5分钟学会B站4K视频下载:免费开源工具完整指南
5分钟学会B站4K视频下载:免费开源工具完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为无法离线观看B站大会…...
终极mdp教程:如何用命令行轻松创建精美Markdown幻灯片
终极mdp教程:如何用命令行轻松创建精美Markdown幻灯片 【免费下载链接】mdp A command-line based markdown presentation tool. 项目地址: https://gitcode.com/gh_mirrors/md/mdp mdp是一款基于命令行的Markdown演示工具,它让你能够直接在终端中…...
在CentOS 7虚拟机里,搞定Cadence IC618版图DRC的License报错(附MAC地址修改法)
在CentOS 7虚拟机中彻底解决Cadence IC618版图DRC的License绑定问题 当你在VMware虚拟机的CentOS 7系统中使用拷贝安装的Cadence IC618进行版图设计时,DRC验证阶段可能会遇到令人头疼的"licensed sufficiently"报错。这个问题通常与虚拟环境的网络配置和L…...
