news 2026/4/3 3:00:48

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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博客

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 12:06:11

Java常见技术分享-26-事务安全-锁机制-常见的锁实现

行级锁 比如 Mysql 里的 InnoDB 引擎&#xff0c; 当你执行更新语句where id 1 时&#xff0c; 会只锁定 id1 这一行数据。 本质上是对索引记录加上排他锁&#xff0c; 当你用主键id1查询时&#xff0c; 他会在主键索引树上找到这个记录&#xff0c; 然后给这个索引项加上排他…

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

内存对决:rust、go、java、python、nodejs

在高负载业务场景中&#xff0c;比如Web服务的高频请求处理、Kafka消息的持续消费、流式计算的实时数据处理&#xff0c;我们常常面临这样的挑战&#xff1a;大量短命对象被频繁创建又销毁&#xff0c;同时少量长命对象长期占用内存。这种场景下&#xff0c;语言的内存分配与垃…

作者头像 李华
网站建设 2026/4/1 13:15:30

《创业之路》-790-KPI含义与用途,以及从系统论的角度看,个人是系统,团队是系统,产品也是系统,对个人KPI指标、团队KPI指标、产品KPI指标的相似处与不同处

KPI 含义与用途✅ 一、KPI 的定义KPI&#xff08;Key Performance Indicator&#xff0c;关键绩效指标&#xff09; 是用于衡量系统在实现其核心目标过程中表现是否达标的关键量化标准。它不是所有指标&#xff0c;而是“最关键的那一小部分”&#xff0c;能够反映成败本质。简…

作者头像 李华
网站建设 2026/4/1 11:02:01

Sonic能否处理带噪音的音频输入?抗干扰能力测试

Sonic 能否处理带噪音的音频输入&#xff1f;抗干扰能力实测分析 在虚拟主播、智能客服和在线教育等场景中&#xff0c;数字人技术正以前所未有的速度走向大众化。越来越多的内容创作者不再依赖昂贵的动作捕捉设备或复杂的3D建模流程&#xff0c;而是通过一张照片加一段语音&am…

作者头像 李华
网站建设 2026/3/22 5:43:11

Sonic数字人能否支持竖屏视频?9:16比例适配

Sonic数字人能否支持竖屏视频&#xff1f;9:16比例适配 在短视频主导内容消费的今天&#xff0c;用户打开手机的第一眼&#xff0c;看到的是一个垂直延伸的画面——9:16。从抖音到快手&#xff0c;从微信视频号到小红书&#xff0c;竖屏早已不是“可选项”&#xff0c;而是唯一…

作者头像 李华
网站建设 2026/3/14 15:14:40

Sonic开发者社区活跃吗?国内外论坛资源汇总

Sonic开发者社区活跃吗&#xff1f;国内外论坛资源汇总 在虚拟数字人技术加速落地的今天&#xff0c;一个核心问题正被越来越多内容创作者和开发者关注&#xff1a;如何用最低的成本、最快的速度生成一段“会说话”的人物视频&#xff1f;传统方案依赖复杂的3D建模、骨骼绑定与…

作者头像 李华