当前位置: 首页 > news >正文

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

前言

        在计算机科学与数据结构领域,栈(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.zskr.cn/news/15840.html

相关文章:

  • 代码随想录算法训练营|Day 25
  • C# 与 C/C++ 互操作
  • 2025多校冲刺CSP模拟赛2 2025.10.4 模拟炸
  • 算法乱谈
  • 信息链路层协议——以太网,ARP协议
  • 实用指南:d-分离:图模型中的条件独立性判定准则
  • [RAG] 基础知识
  • 数据结构 - 字典树 Trie
  • 激活函数实现
  • win10界面如何改成经典菜单?
  • 量子迁移计划启动:应对未来密码学挑战
  • 珂朵莉树 ODT
  • 01.linux基础
  • 详细介绍:Kubernetes实战:MariaDB误删恢复与数据持久化
  • 从模拟入侵到渗透测试:我摸清了黑客的套路,也懂了企业的软肋 - 详解
  • 集合幂级数,FMT 与 FWT 学习笔记
  • 上传文件前端需要注意的三个点:
  • Jenkins安装与配备
  • 适合新手的PPT模板网站,简单操作但效果好!
  • 无人机常用的几种飞行模式
  • springCloudMaven打包配置 - br
  • 题解:P5504 [JSOI2011] 柠檬
  • 太简单了!原来PS在线抠图可以这么玩,背景分离无压力
  • 深入解析:【Leetcode】随笔
  • DateStyle日期时间字符串序列化 - br
  • 十月四日就听《10월 4일》
  • 赋能制造新质生产力:制造业专用低代码平台选型指南(2025) - 详解
  • 4-7〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸文件上传漏洞-B - 实践
  • 完整教程:六款智能证照工具盘点,打造个性化“数字身份档案”
  • 深入解析:音频降噪技术:从原理到工具的完整指南(scipy librosa noisereduce soundfile pedalboard)