嵌入式第二十七篇——数据结构——栈

一、栈的基本概念

栈是一种遵循**后进先出(LIFO)**原则的线性数据结构,仅允许在栈顶进行插入(入栈)和删除(出栈)操作。栈的核心操作包括:

Push: 将元素添加到栈顶。

Pop: 移除并返回栈顶元素。

Peek/Top: 获取栈顶元素但不移除。

IsEmpty: 检查栈是否为空。

二、栈的实现

c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int *items;     // 动态数组存储栈元素
    int top;        // 栈顶指针
    int capacity;   // 栈容量
} Stack;

// 初始化栈
Stack* createStack(int capacity) {
    Stack *stack = (Stack*)malloc(sizeof(Stack));
    stack->capacity = capacity;
    stack->top = -1;  // 栈空时top为-1
    stack->items = (int*)malloc(capacity * sizeof(int));
    return stack;
}

// 检查栈是否为空
int isEmpty(Stack *stack) {
    return stack->top == -1;
}

// 检查栈是否已满
int isFull(Stack *stack) {
    return stack->top == stack->capacity - 1;
}

// 入栈操作
void push(Stack *stack, int item) {
    if (isFull(stack)) {
        printf("栈已满,无法入栈\n");
        return;
    }
    stack->items[++stack->top] = item;
}

// 出栈操作
int pop(Stack *stack) {
    if (isEmpty(stack)) {
        printf("栈为空,无法出栈\n");
        exit(EXIT_FAILURE);
    }
    return stack->items[stack->top--];
}

// 获取栈顶元素
int peek(Stack *stack) {
    if (isEmpty(stack)) {
        printf("栈为空\n");
        exit(EXIT_FAILURE);
    }
    return stack->items[stack->top];
}

// 释放栈内存
void freeStack(Stack *stack) {
    free(stack->items);
    free(stack);
}

int main() {
    Stack *stack = createStack(5);  // 创建容量为5的栈

    push(stack, 10);
    push(stack, 20);
    push(stack, 30);

    printf("栈顶元素: %d\n", peek(stack));  // 输出30
    printf("出栈元素: %d\n", pop(stack));   // 输出30

    freeStack(stack);  // 释放内存
    return 0;
}

三、关键点说明

动态数组 :通过malloc动态分配内存,支持灵活的容量调整(需自行实现扩容逻辑)。

错误处理:在出栈或获取栈顶元素时检查栈空状态,避免未定义行为。

时间复杂度:所有操作(Push/Pop/Peek)均为 O(1)

相关推荐
MY_TEUCK8 小时前
Sealos 平台部署实战指南:结合 Cursor 与版本发布流程
java·人工智能·学习·aigc
三毛的二哥8 小时前
BEV:典型BEV算法总结
人工智能·算法·计算机视觉·3d
南宫萧幕9 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
charlie11451419110 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler0110 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你9110 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
我叫黑大帅10 小时前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头11 小时前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法
skilllite作者11 小时前
AI agent 的 Assistant Auto LLM Routing 规划的思考
网络·人工智能·算法·rust·openclaw·agentskills
破浪前行·吴12 小时前
数据结构概述
数据结构·学习