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

C语言数据结构-数组实现栈详解

在计算机科学中,栈是一种遵循“后进先出”(LIFO)原则的数据结构。在C语言中,我们可以用数组来构建一个栈。数组为我们提供了一块连续的内存空间。我们定义栈的最大容量为5,这意味着我们的栈最多只能存放5个元素。

#include <stdio.h> #define MAX_SIZE 5 // 定义栈的最大容量为5

栈的核心在于两个关键变量:一个用于存储数据的数组,和一个指示当前位置的指针。我们把这个指针命名为top,告诉我们当前栈顶在哪里。初始时,栈是空的,因此我们将top设置为-1。因为数组的下标从0开始,-1则表示“无元素”的状态。

int stack[MAX_SIZE]; // 声明一个整型数组作为栈的存储空间,数组大小是 MAX_SIZE int top = -1; // 声明并初始化栈顶指针;top 表示栈顶元素在数组中的下标;初始值 -1 表示空栈

一、初始化栈(initStack)

// 初始化栈 void initStack() { top = -1; // 重置栈顶指针为-1(空栈状态) printf("栈已初始化\n"); }

二、入栈操作(push)

先判断是否为满栈,再进行入栈操作。

  • ++top:先把 top 加1(如果是空栈,从-1变成0)
  • stack[top] = value; 把值存入新的栈顶位置
void push(int value) { if (top == MAX_SIZE - 1) { // 判断栈是否已满 printf("栈已满,%d 无法入栈!\n", value); return; // 直接返回 } stack[++top] = value; // 入栈操作 printf("%d 入栈成功\n", value); }

三、出栈操作(pop)

我们需要先检查栈是否为空,如果不为空,就取出栈顶元素,然后将top指针减1。代码中的stack[top--]实现了这个逻辑:先使用当前的top值获取元素,然后将top减1。这个过程不会真正删除数组中的数据,只是移动了指针,原来的数据仍然存在,但已经被标记为“无效”,因为它在当前栈的范围之外。

void pop() { if (top == -1) { // 判断栈是否为空 printf("栈为空,无法出栈!\n"); return; // 直接返回 } int value = stack[top--]; // stack[top]:先获取当前栈顶的值; top--:然后把栈顶指针减1 printf("%d 出栈成功\n", value); }

四、显示栈顶元素(topValues)

查看栈顶元素,只需返回stack[top]的值,而不改变top指针。

void topValues() { if (top == -1) { // 判断栈是否为空 printf("栈为空\n"); return; } printf("栈顶元素: %d\n", stack[top]); // 显示栈顶元素,但不修改top }

五、打印栈元素(printStack)

在打印时,我们从栈底(数组索引0)开始,一直打印到栈顶(数组索引top),这样我们看到的顺序就是元素入栈的顺序。

void printStack() { if (top == -1) { printf("栈为空\n"); return; } printf("栈内容: "); for (int i = 0; i <= top; i++) { // 从栈底到栈顶遍历 printf("%d ", stack[i]); } printf(" <-- 栈顶\n"); }

六、主函数main

通过一个简单的测试来观察栈的行为。尝试将41、42、43、44、45、46这六个数字依次入栈。由于栈的容量是5,前五个数字会成功入栈,而第六个数字46会遇到栈满的错误。这时程序不会崩溃,而是给出提示:“栈已满,46无法入栈!”。

接着,查看当前栈的状态。栈里有41、42、43、44、45这五个数字,栈顶是45。然后我们执行三次出栈操作,依次移除45、44和43。现在栈里只剩下41和42,栈顶是42。这个过程清晰展示了“后进先出”的原则:最后入栈的45最先被移除。

int main() { initStack(); // 初始化栈 printf("=== 入栈 ===\n"); for (int i = 41; i <= 46; i++) { // 入栈6次(容量只有5) push(i); // 第6次会失败 } printStack(); // 打印当前栈 topValues(); // 查看栈顶 printf("\n=== 出栈3次 ===\n"); for (int i = 0; i < 3; i++) { // 出栈3次 pop(); } return 0; }

七、运行结果展示

通过这个简单的数组实现,我们可以学会编写数组实现栈的代码,更重要的是理解了的核心思想。数组实现的栈简单直观,但有一个明显的限制:大小固定。当我们不知道需要多少存储空间时,固定大小的数组可能不够灵活。这时可以考虑使用链表实现栈,那样就能动态调整大小,但实现起来会稍微复杂一些。

单链表实现栈详见这篇:C语言数据结构-单链表实现栈详解-CSDN博客

http://www.jsqmd.com/news/183056/

相关文章:

  • Sonic模型依赖项安装踩坑指南:CUDA版本匹配
  • 使用 WSL 管理 Ubuntu 完整指南
  • nt!WMIInitialize函数分析之WMIAdminDevice和WMIDataDevice设备对象的建立
  • 《创业之路》-788-KPI和OKR的考核机制的比较:如果你需要控结果、保交付、管绩效 → 用好KPI;如果你想激活力、促创新、对齐战略 → 引入OKR
  • 关于图表,对理解IT系统业务流程设计的辅助作用
  • Sonic数字人能否支持竖屏视频?9:16比例适配
  • Sonic数字人用户反馈收集表上线,欢迎填写
  • 对于技术栈的多角度理解
  • 内存对决:rust、go、java、python、nodejs
  • 《创业之路》-789-UML描述软件系统与研发团队的组织系统,要高效运行的相似点与相异点。
  • 上位机知识篇---文件传输
  • 社区疾病预防与健康管理微信小程序的设计与实现
  • Sonic能否用于聋哑人手语转换?跨模态扩展思考
  • 《创业之路》-790-KPI含义与用途,以及从系统论的角度看,个人是系统,团队是系统,产品也是系统,对个人KPI指标、团队KPI指标、产品KPI指标的相似处与不同处
  • Linux命令-ifup命令(激活网络接口)
  • 基于GWO优化Transformer多输入多输出回归预测与改进NSGA III的多目标优化附Matlab代码
  • gin HTTP路由分析
  • 《创业之路》-792-产品有哪些常见的关键技术指标? 个人有哪些关键的绩效指标?企业经验有哪些关键绩效指标? 给出示例
  • Sonic能否处理带噪音的音频输入?抗干扰能力测试
  • Sonic模型License变更预警:关注最新开源协议动态
  • 《代码大全2》观后感(八):测试——代码质量的“最后一道关卡”
  • python装饰器(一)
  • 《创业之路》-794-对于相同的现实问题,中底层管理者关注当下、内部、成本、效率、战术、营收、一次性;高层管理者关注未来、外部、资本、价值、战略、竞争性、持续性。
  • RTX 4090运行Sonic有多快?生成1分钟视频仅需XX秒
  • Iridescent:Day44
  • Sonic开发者社区活跃吗?国内外论坛资源汇总
  • Sonic数字人可用于元宇宙场景?虚拟形象生成新方向
  • Sonic项目使用PyCharm调试?远程解释器配置技巧
  • NOIP T4大学习
  • 导师推荐!2025继续教育AI论文平台TOP9测评