news 2026/2/12 7:18:28

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/2/12 0:02:26

对于技术栈的多角度理解

我们对技术栈的了解和把握&#xff0c;应该是要有多个维度的 1.技术栈的内涵和内容是什么 他的内部结构&#xff0c;内部拓扑图是什么。 他提供了什么领域的什么机制 了解了这些内部拓展以后&#xff0c; 如何灵活的使用这些机制 出问题了如何定位在哪里 2.技术栈在项目中真…

作者头像 李华
网站建设 2026/2/7 4:03:55

Sonic项目使用PyCharm调试?远程解释器配置技巧

Sonic项目开发调试实战&#xff1a;PyCharm远程解释器配置与参数调优全解析 在AI内容生成技术加速落地的今天&#xff0c;数字人已不再是实验室里的概念产物。从虚拟主播到智能客服&#xff0c;越来越多的应用场景要求我们能快速、高效地生成口型同步、表情自然的说话视频。腾讯…

作者头像 李华
网站建设 2026/2/9 20:07:47

Sonic数字人能否长时间连续说话?稳定性压力测试

Sonic数字人能否长时间连续说话&#xff1f;稳定性压力测试 在虚拟主播24小时不间断带货、在线教育平台批量生成课程视频的今天&#xff0c;一个核心问题浮出水面&#xff1a;我们依赖的AI数字人&#xff0c;真的能“撑得住场子”吗&#xff1f;尤其是像Sonic这样以轻量高效著称…

作者头像 李华
网站建设 2026/2/11 10:25:50

RTX 4090运行Sonic有多快?生成1分钟视频仅需XX秒

RTX 4090运行Sonic有多快&#xff1f;生成1分钟视频仅需38秒 在短视频内容爆炸式增长的今天&#xff0c;一个现实问题摆在创作者面前&#xff1a;如何以最低成本、最快速度产出高质量数字人视频&#xff1f;传统方式依赖专业团队和昂贵设备&#xff0c;而如今&#xff0c;一块消…

作者头像 李华
网站建设 2026/2/10 17:38:15

Sonic输出视频帧率可调吗?常见30fps/60fps设置方法

Sonic输出视频帧率可调吗&#xff1f;常见30fps/60fps设置方法 在短视频创作、虚拟主播和AI教学内容爆发的今天&#xff0c;越来越多开发者与内容创作者开始使用轻量级语音驱动数字人技术。其中&#xff0c;Sonic作为腾讯联合浙江大学推出的端到端口型同步模型&#xff0c;凭借…

作者头像 李华
网站建设 2026/2/10 3:10:50

Sonic能否与Blender联动?后期合成进阶玩法

Sonic与Blender联动&#xff1a;解锁数字人后期合成新范式 在虚拟主播一夜涨粉百万、AI教师走进在线课堂的今天&#xff0c;一个现实问题摆在内容创作者面前&#xff1a;如何用最低成本、最快速度做出看起来“不像AI”的数字人视频&#xff1f;传统的3D建模动作捕捉流程动辄需要…

作者头像 李华