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

一、栈的基本概念

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

相关推荐
wabs6669 分钟前
关于单调栈【力扣503.下一个更大元素II的思考】
算法·单调栈
c2385613 分钟前
下篇:伸缩魔法!进阶吃透可变滑动窗口篇
c++·算法
txzrxz18 分钟前
关于二维/多维前缀和
算法
来一碗刘肉面23 分钟前
顺序表的按值查找
数据结构·c++·算法
捷瑞电子工坊25 分钟前
C语言取地址符 `&` 极简教程
c语言·c语言基础·取地址符·指针入门
~kiss~27 分钟前
大模型的PEFT~ 参数高效微调 Parameter-Efficient Fine-Tuning
学习
minglie11 小时前
zynq中axi_dma的三个实验-第1课:PL搭建
学习
zzz_23681 小时前
【Java实习面试算法冲刺】图论
java·算法·面试
大鱼>1 小时前
宠物监控数据安全与隐私保护:端到端加密与合规实践
人工智能·深度学习·算法·iot·宠物
被自己蠢哭1 小时前
BFS广度优先搜索问题:#P00496. 华为od机试—自动泊车
算法