news 2026/4/23 20:18:42

数据结构——栈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构——栈

一、栈的定义

栈的概念:

栈:栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。

栈遵守一个规则:先进后出,后进先出

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

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

其实栈的结构就和弹夹的结构一样,后放入的子弹先打出来(后进栈的数据先出栈),最先放入的子弹最后打(先进栈的数据后出栈)。

如下是栈的流程图:

二、栈的结构

typedef int Type;//数据类型的重命名 typedef struct ST { Type* arr; //存储空间基址 int top; //栈顶下标 int capacity; //栈的容量 }ST;

三、栈的核心功能

1、栈的初始化和销毁

1.1、栈的初始化

栈顶top初始化时可以有两种方法

1、top初始化为0,指向下一个栈顶元素的存储地址

2、top初始化为-1,指向的是当前栈顶的位置

而此方法top初始化为0,因为当top初始化为0时也可以等价为size,可以知道栈里面有多少个元素

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

1.2、栈的销毁

void STdestroy(ST* ps) { assert(ps); free(ps->arr); ps->arr = NULL; ps->top = ps->capacity = 0; }

2、入栈和出栈操作

2.1、入栈

我们在入栈时需要检查空间是否够用,如果空间满了就需要进行动态扩容

我们入栈之后需要把top++,让top指向下一个入栈元素的地址

void STPush(ST* ps, Type x) { assert(ps); if (ps->top == ps->capacity) { int newcapacity = ((ps->top == 0) ? 4 : 2 * ps->top); Type* tmp = (Type*)realloc(ps->arr, sizeof(Type) * newcapacity); if (tmp == NULL) { perror("realloc fail"); return; } ps->arr = tmp; ps->capacity = newcapacity; ps->arr[ps->top++] = x; } else { ps->arr[ps->top++] = x; } }

2.2、出栈

出栈就直接使top--,因为top指向的是下一个入栈元素的地址,所以直接top--,当下一个入栈元素入栈之后就会直接覆盖

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

3、栈中元素个数、栈顶元素和栈是否为空

3.1、栈中元素个数

上面提到过当top初始化为0,就与size具有相同的效果,记录元素的个数,所以我们直接返回top

int STSize(ST* ps) { return ps->top; }

3.2、获取栈顶元素

因为top是指向下一个入栈元素的地址,所以当我们需要获取当前栈顶数据时,需要对top进行-1操作,使其指向当前栈顶

int STTop(ST* ps) { assert(ps); assert(ps->top > 0); return ps->arr[ps->top - 1]; }

3.3、判断栈是否为空

如果top = 0 说明栈里面没有元素返回true,top != 0 说明栈不为空返回false

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

四、栈的实现

ST.h

#pragma once #include<stdio.h> #include<assert.h> #include<string.h> #include<stdbool.h> typedef int Type; typedef struct ST { Type* arr; //存储空间基址 int top; //栈顶下标 int capacity; //栈的容量 }ST; //栈的初始化 void STInit(ST* ps); //栈的销毁 void STdestroy(ST* ps); //入栈 void STPush(ST* ps, Type x); //出栈 void STPop(ST* ps); //获取栈中元素个数 int STSize(ST* ps); //获取栈顶元素 int STTop(ST* ps); //判断栈是否为空 bool STEmpty(ST* ps);

ST.c

#define _CRT_SECURE_NO_WARNINGS #include "ST.h" //栈的初始化 void STInit(ST* ps) { assert(ps); ps->arr = NULL; ps->top = ps->capacity = 0; } //栈的销毁 void STdestroy(ST* ps) { assert(ps); free(ps->arr); ps->arr = NULL; ps->top = ps->capacity = 0; } //入栈 void STPush(ST* ps, Type x) { assert(ps); if (ps->top == ps->capacity) { int newcapacity = ((ps->top == 0) ? 4 : 2 * ps->top); Type* tmp = (Type*)realloc(ps->arr, sizeof(Type) * newcapacity); if (tmp == NULL) { perror("realloc fail"); return; } ps->arr = tmp; ps->capacity = newcapacity; ps->arr[ps->top++] = x; } else { ps->arr[ps->top++] = x; } } //出栈 void STPop(ST* ps) { assert(ps); assert(ps->top > 0); ps->top--; } //获取栈中元素个数 int STSize(ST* ps) { return ps->top; } //获取栈顶元素 int STTop(ST* ps) { assert(ps); assert(ps->top > 0); return ps->arr[ps->top - 1]; } //判断栈是否为空 bool STEmpty(ST* ps) { assert(ps); return ps->top == 0; }

STtest.c

#include"ST.h" int main() { ST s; STInit(&s); STPush(&s,1); STPush(&s, 2); STPush(&s, 3); STPush(&s, 4); STPush(&s, 5); while (STEmpty(&s) != true) { printf("%d ", STTop(&s)); STPop(&s); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 16:05:08

基于springboot + vue汽车销售系统

汽车销售系统 目录 基于springboot vue汽车销售系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue汽车销售系统 一、前言 博主介绍…

作者头像 李华
网站建设 2026/4/23 14:13:55

15、网络安全检测与防护:psad的功能与应用

网络安全检测与防护:psad的功能与应用 1. psad对异常流量的检测 psad在网络安全检测中发挥着重要作用,它能够检测多种异常流量,以下是几种常见的检测场景: - LAND攻击检测 :psad通过检查iptables日志中的SRC和DST字段是否相同来进行sameip测试。为减少误报,会排除环回…

作者头像 李华
网站建设 2026/4/23 16:17:08

21、网络安全:Snort 与 iptables 的协同应用及 fwsnort 部署指南

网络安全:Snort 与 iptables 的协同应用及 fwsnort 部署指南 在网络安全领域,Snort 和 iptables 是两款强大的工具,它们在入侵检测和防护方面发挥着重要作用。本文将深入探讨 Snort 规则选项在 iptables 中的模拟应用,以及 fwsnort 的部署方法。 1. Snort 规则与 iptable…

作者头像 李华
网站建设 2026/4/23 14:30:26

vue基于springboot的图书资料借阅信息管理系统的设计与实现

目录已开发项目效果实现截图开发技术介绍系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/4/23 11:47:48

中文语音合成新标杆!EmotiVoice对本土语言优化出色

中文语音合成新标杆&#xff01;EmotiVoice对本土语言优化出色 在虚拟主播的直播间里&#xff0c;一句“今天真是个令人兴奋的好日子&#xff01;”如果用机械平淡的声音念出&#xff0c;观众可能毫无波澜&#xff1b;但若语气轻快、语调上扬&#xff0c;带着抑制不住的喜悦感&…

作者头像 李华
网站建设 2026/4/23 11:45:12

LeetCode(python)——236.二叉树的最近公共祖先

题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它…

作者头像 李华