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

一、栈的基本概念

栈是一种遵循**后进先出(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)

相关推荐
伊布拉西莫1 分钟前
【流畅的Python】第20章:并发执行器 — 学习笔记
笔记·python·学习
qq_85730581922 分钟前
python语法
开发语言·python·算法
jinglong.zha29 分钟前
LScript-从零基础到商业变现的AI自动化学习平台
运维·学习·自动化
DXM052139 分钟前
第9期|从机器学习到深度学习:AI遥感解译的进化逻辑
人工智能·算法·计算机视觉
小蒋学算法1 小时前
算法-阶乘函数后K个零
算法
闪闪发亮的小星星1 小时前
STK_00 学习方案路线
学习
weixin_307779131 小时前
智能模拟数据生成平台:生成式AI合成数据技术重塑开发测试效能
人工智能·测试工具·算法·测试用例
Darling噜啦啦1 小时前
JavaScript 数组深度解析:从纯函数到二维数组陷阱,一文吃透前端数据结构核心
前端·javascript·数据结构
一楼的猫1 小时前
茄子写作助手——品牌搜索突破9万后的技术型品牌认知与官网入口指南
人工智能·学习·机器学习·chatgpt·ai写作
AOwhisky2 小时前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算