完整教程:数据结构从入门到实战————栈

news/2025/10/4 20:27:13/文章来源:https://www.cnblogs.com/yxysuanfa/p/19125888

前言

        在计算机科学与数据结构领域,栈(Stack) 是一种重要的线性数据结构,遵循“后进先出”(Last In, First Out, 简称 LIFO)的原则。作为抽象数据类型的一种典型实现,栈通过限制插入和删除操作的位置,构建了一个高效且易于管理的数据访问模型。

栈的基本功能:

  • 后进先出(LIFO)操作:栈遵循“最后进入的元素最先被访问或移除”的原则,仅允许在栈顶进行插入(Push)和删除(Pop)操作,确保数据按逆序处理。
  • 高效的入栈与出栈:压栈和弹栈操作的时间复杂度均为 O(1),无需移动其他元素,适合频繁添加和删除的场景。
  • 栈顶访问支持:提供 Peek 或 Top 操作,可在不修改栈结构的前提下查看当前栈顶元素,用于预判或条件判断。
  • 动态容量扩展:基于动态数组或链表实现时,栈可自动扩容,适应不确定规模的数据存储需求,避免预先分配过多内存。
  • 运行状态管理能力:天然适用于保存程序执行上下文,如函数调用、递归展开、表达式求值等需要回溯的历史状态管理任务。

        综上所述,栈作为一种基础而强大的数据结构,以其简洁的操作接口和高效的运行性能,在程序设计中扮演着不可或缺的角色。尽管其访问模式受到严格限制,但正是这种约束赋予了它在特定应用场景下的卓越表现。本文系统阐述了栈的基本操作、实现方式及其优缺点,旨在帮助读者深入理解其工作原理,并能够在实际开发中灵活运用,为构建更复杂的算法与系统奠定坚实基础。


正文开始

一、栈

1.1 栈的基本概念以及结构

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

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

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

二、 栈的实现

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

项目结构如下:

2.1 定义栈的结构以及方法的声明

Stack.h

#pragma once
#include 
#include 
#include 
#include 
//首先先定义栈的结构
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
//栈的初始化
void STInit(ST* pst);
//栈的销毁
void STDestroy(ST* pst);
//入栈
void STInsert(ST* pst);
//出栈
void STPop(ST* pst);
//获取栈顶数据
void STTop(ST* pst);
//判断栈是否为空
bool STEmpty(ST* pst);
//获取栈里面的数据个数
int STSize(ST* pst);

2.2 栈的初始化

Stack.c

//栈的初始化
void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;
}

2.3 栈的销毁

Stack.c

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

2.4 入栈

Stack.c

//入栈
void STInsert(ST* pst, STDataType x)
{assert(pst);//扩容if (pst->capacity == pst->top){int new_capacity = pst->capacity == 0 ? 4 : pst->capacity * 2;ST* tmp = (ST*)realloc(pst->a, new_capacity * sizeof(STDataType);if (tmp == NULL){perror("realloc fail!");return;}pst->a = tmp;pst->capacity = new_capacity;}pst->a[pst->top++] = x;
}

2.5 出栈

Stack.c

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

2.6 获取栈顶的数据

//获取栈顶数据
void STTop(ST* pst)
{assert(pst && pst->top > 0);return pst->a[pst->top - 1];
}

2.7 判断栈是否为空

//判断栈是否为空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}

2.8 获取栈里面元素的个数

//获取栈里面的数据个数
int STSize(ST* pst)
{assert(pst);return pst->top;
}

测试结果如下:

码云链接:https://gitee.com/a-qian-c-language/data-structure.git

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

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

相关文章

解码Huffman 编码与 Huffman 树

为什么需要 Huffman 编码?—— 从 “编码浪费” 说起 在数据通信或存储中,我们需要将字符转换成二进制码(如 ASCII 码)。但常规编码(如 ASCII)存在一个问题:无论字符出现频率高低,都用相同长度的编码(比如 AS…

『回忆录』初三来高中的半学期

搬运自洛谷小号。看到过去的自己莫名地想哭。前情摘要:CSP2023S 90 分有关考试 估计在 560 左右,算是很差的。 语文:[80,100] 数学:[105,114] 英语:127 物理:[62,64] 化学:[87,88] 生物:97 总分:[560,580]目标…

怎么维护好网站.net网站 还原数据库备份

数据中台的定义 在云开发中,数据中台是一个综合性的数据管理和服务平台,它集成了数据管理、数据治理、数据服务等多个功能,并基于云计算技术架构而建立。数据中台的核心目标是为企业提供稳定、高效、安全的数据支持和服务,进而推…

10.1 容器云部署准备(一) - 实践

10.1 容器云部署准备(一) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

企业网站必须备案吗h5页面可以跳转到小程序吗

思路: 需求1:检测用户输入的字数 注册input事件 将输入文本长度赋值给对应的数值 需求2:输入不能为空 点击按钮之后判断 如果输入为空,则提示不能输入为空,并直接return 为了防止无意义的一些输入,利用字符…

常州网站建设怎么样网站之家查询

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在前端开发中,有时候一些业务场景中,我们有需求要去实现excel的预览和打印功能,本文在vue3中如何实现Excel文件的预览和打印。 预览excel 关于实现excel文档在…

dede可以做商城网站吗一个新产品怎么推广

作者:Liuweifei 硬盘结构 1.硬盘结构 ​ 硬盘大致由盘片、读写头(磁头)、马达、底座、电路板等几大项组合而成。 ​ 硬盘的每一个盘片都有两个盘面,即上、下盘面。每个盘面都能利用,都可以存储数据,成为…

建筑工程招聘网站哪个好建站模板招募设计师

102. 最佳牛围栏 农夫约翰的农场由N块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头。 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。 围起区域内至少需要包…

关于缓冲区以及输出方式

先有个前置知识:CPU 速度差不多是 I/O 设备的 \(10^6\) 倍这样 CPU 访问内存的顺序:L1 缓存 → L2 缓存 → L3 缓存 → 主内存 → I/O设备 系统调用发生在「主内存 → I/O 设备」这一步中 缓冲区通常设置在主内存中为…

asp网站可运行jsp吗wordpress接入安卓

在计算机使用过程中,我们可能会遇到一些错误提示,其中“找不到msvcr120.dll”就是常见的一种。那么,找不到msvcr120.dll是什么意思呢? 一,msvcr120.dll文件概述 msvcr120.dll 是 Microsoft Visual C Redistributable …

详细介绍:2025三掌柜赠书活动第三十五期 AI辅助React Web应用开发实践:基于React 19和GitHub Copilot

详细介绍:2025三掌柜赠书活动第三十五期 AI辅助React Web应用开发实践:基于React 19和GitHub Copilot2025-10-04 20:11 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: norm…

网站推广设计制作专做女装拿货的网站

目录 1、向量点乘 2、相似度计算举例 3、QKV分析 4、整体流程 (1) 首先从词向量到Q、K、V (2) 计算Q*(K的转置),并归一化之后进行softmax (3) 使用刚得到的权重矩阵,与V相乘,计算加权求和。 5、多头注意力 上面…

深圳建设银行宝安支行网站市场营销在线课程

1. JVM快速入门 从面试开始: 请谈谈你对JVM 的理解?java8 的虚拟机有什么更新? 什么是OOM ?什么是StackOverflowError?有哪些方法分析? JVM 的常用参数调优你知道哪些? 内存快照抓取和MAT分…

coduck模拟赛一 补题报告 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

RippleNet: Propagating User Preferences on the Knowledge Graph for Recommender Systems

1.知识图谱嵌入的基本过程,为什么难以直观有效表达项目间的关系 1.1基本过程(知识图谱嵌入)构建三元组: 将知识图谱表示为(头实体h, 关系r, 尾实体t)集合。向量化建模: 为每个实体、关系分配可学习的向量/矩阵,常见…

特地拎出来的总结

这篇总结不太一样,为了纪念和我爸喋喋不休吵了近3h的时间和教训,用Deepseek共同完成 : 题目 T674176 T2-任务task 题目描述 时间限制: 2.0 秒 空间限制: 512 MiB 有 \(n\) 个任务,第 \(i\) 个任务需要占据 \([l_…

在线做漫画的网站wordpress多用户评论

文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体,注重量化的综合性知识体系。特别是,信息可视化技术手段和方法的运用,可直观的展示主题的研究发展历程、研究现状、研究…

漏洞赏金计划的困境:i915漏洞与ChromeOS、Intel赏金项目剖析

本文深入探讨了漏洞赏金计划存在的系统性问题,通过作者亲身经历的i915驱动漏洞案例,揭示了Google和Intel在处理安全漏洞报告过程中的沟通不畅、缺乏透明度等问题,并分析了漏洞赏金计划中权力失衡的根本原因。漏洞赏…

wordpress站名在哪改项目协同管理平台

在 Unix 环境下," 寄存器需要 xterm-clipboard feature 的 VIM 软件才能使用,具有这个 feature 的 VIM 可以安装 vim-gtk(包含gvim和vim),使用 gvim 可以正常调用 " 寄存器。

2025异型件厂家推荐:邯郸市烁燊紧固件,广泛应用于建筑、桥梁、机械、电力、交通等诸多领域

在现代工业体系中,异型件作为关键基础零部件,广泛应用于建筑、桥梁、机械、电力、交通等诸多领域。随着各行业的快速发展,对异型件的质量、性能和精度等方面提出了更高的要求。在这样的背景下,邯郸市烁燊紧固件有限…