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语言数据结构-单链表实现栈详解-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值