news 2026/2/9 2:38:03

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/7 21:49:16

Sonic数字人用户反馈收集表上线,欢迎填写

Sonic数字人用户反馈收集表上线&#xff0c;欢迎填写 在内容创作的门槛被AI不断击穿的今天&#xff0c;一个普通人是否也能拥有一位24小时在线、表情自然、口型精准的“数字分身”&#xff1f;答案正在变得越来越肯定。随着生成式AI技术的深入发展&#xff0c;数字人已不再是影…

作者头像 李华
网站建设 2026/1/30 6:17:48

Sonic能否支持VR头显输出?沉浸式交互初步探索

Sonic能否支持VR头显输出&#xff1f;沉浸式交互初步探索 在虚拟现实内容创作的前沿&#xff0c;一个看似简单却极具挑战性的问题正在浮现&#xff1a;我们能否让一张静态照片“活”起来&#xff0c;并让它自然地出现在VR世界中&#xff0c;与用户面对面交流&#xff1f;这不仅…

作者头像 李华
网站建设 2026/2/7 17:59:07

强烈安利10个AI论文平台,MBA论文写作必备!

强烈安利10个AI论文平台&#xff0c;MBA论文写作必备&#xff01; AI 工具如何让论文写作更高效 在当今快节奏的学术环境中&#xff0c;MBA 学生和研究人员正面临着越来越高的论文写作压力。从选题到定稿&#xff0c;每一个环节都可能成为阻碍进度的瓶颈。而 AI 工具的出现&…

作者头像 李华
网站建设 2026/2/7 5:57:09

FPGA实现MIL - STD1553B协议源码解析:通用且强大的通信利器

fpga MIL-STD1553B源码&#xff0c;支持BC &#xff0c;BM&#xff0c;RT。 可任意移植到xilinx,altera,actel全系列型号&#xff01;功能和接口可参考actel芯片1553b核&#xff0c;纯源码&#xff01;在FPGA开发领域&#xff0c;MIL - STD1553B协议的实现一直是个热门话题。今…

作者头像 李华
网站建设 2026/2/6 17:37:19

桥梁监测系统稳定性测试:核心指标与异常场景验证指南

‌桥梁监测系统稳定性测试指南‌ ‌一、测试目标与特性分析‌ ‌1.1 系统稳定性定义 - &zwnj;**核心指标**&zwnj;&#xff1a;误报率&#xff08;<0.1%&#xff09;&#xff5c;漏报率&#xff08;<0.05%&#xff09;&#xff5c;连续无故障运行时长&#xff…

作者头像 李华