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

一、栈的基本概念

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

相关推荐
孞㐑¥32 分钟前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风36 分钟前
代码随想录第十五天
数据结构·算法·leetcode
XX風1 小时前
8.1 PFH&&FPFH
图像处理·算法
知南x1 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
NEXT061 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠2 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio2 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice2 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
想进个大厂2 小时前
代码随想录day37动态规划part05
算法
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章22-Harris角点
图像处理·人工智能·opencv·算法·计算机视觉