news 2026/3/17 14:26:59

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/14 13:44:45

Sonic数字人服装更换功能?目前依赖图像预处理

Sonic数字人如何实现服装更换&#xff1f;答案藏在图像预处理中 在虚拟主播24小时不间断直播、短视频工厂批量生产口播内容的今天&#xff0c;数字人早已不再是实验室里的概念玩具。真正让这类技术落地的关键&#xff0c;并非一味追求3D建模的复杂度&#xff0c;而是找到一条“…

作者头像 李华
网站建设 2026/3/13 6:52:22

细品古诗,神交古人

14.《忘川谣》 传说阴间有忘川&#xff0c;饮其水者忘前缘。 我愿此川现人世&#xff0c;洗尽恩怨焕新天。 15.《洛神新赋》 洛水女神今何在&#xff1f;虚拟现实显真身。 凌波微步像素动&#xff0c;回眸一笑迷众生。 16.《精卫石》 精卫衔石填海忙&#xff0c;愚公移山志气…

作者头像 李华
网站建设 2026/3/14 19:37:50

Sonic生成失败报错怎么办?常见错误代码速查表

Sonic生成失败报错怎么办&#xff1f;常见错误代码速查表 在虚拟内容创作爆发的今天&#xff0c;数字人技术正以前所未有的速度渗透进短视频、在线教育、电商直播等场景。一个只需上传一张照片和一段音频&#xff0c;就能自动生成“会说话”的人物视频的工具——Sonic&#xff…

作者头像 李华
网站建设 2026/3/12 20:06:38

以太网交换基础

目标描述以太网的基本概念&#xff1b;区分MAC地址的类型&#xff1b;描述二层交换机的工作流程&#xff1b;描述MAC地址表的构成与形成过程。一、以太网协议介绍1.以太网协议以太网是当今现有局域网采用的最通用的通信协议标准&#xff0c;该标准定义了在局域网中采用的电缆类…

作者头像 李华
网站建设 2026/3/16 16:21:15

Sonic数字人视频SEO优化技巧:提升搜索引擎曝光率

Sonic数字人视频SEO优化技巧&#xff1a;提升搜索引擎曝光率 在短视频流量主导内容分发的今天&#xff0c;企业与创作者正面临一个共同挑战&#xff1a;如何以低成本、高效率持续产出优质视频内容&#xff1f;传统真人出镜模式受限于人力、设备和制作周期&#xff0c;难以满足…

作者头像 李华
网站建设 2026/3/12 9:51:21

Java小白求职记:深入互联网大厂面试技术要点

场景&#xff1a;互联网大厂Java小白求职者面试 角色&#xff1a;面试官&#xff08;严肃&#xff09;&#xff0c;小白程序员&#xff08;超好吃&#xff09; 第一轮&#xff1a;基础技术与应用 面试官&#xff1a;我们先从核心语言和平台开始。你对Java SE 8的新特性了解多少…

作者头像 李华