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

一、栈的基本概念

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

相关推荐
一条破秋裤5 分钟前
06_从设备读数据_字符设备read_write流程
学习
mmmmath_35 分钟前
二叉树の一些知识
数据结构·算法
DongQiShanRen9 分钟前
裁决台账双向互校(下):台账哈希链、三向对账与最小落地
人工智能·深度学习·算法·目标跟踪·自然语言处理·rust·哈希算法
程序员清风17 分钟前
数据类型转换与日期时间处理
数据结构·pandas
SWAGGY..27 分钟前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
-dzk-29 分钟前
【技巧】LC 31.下一个排列
算法
m4Rk_42 分钟前
【论文阅读】Agent 记忆机制(92):EMPO²——让 Memory 从经验复用走向主动探索
论文阅读·人工智能·学习·开源·github
她说彩礼65万1 小时前
C语言 assert
java·linux·c语言
(Charon)1 小时前
【C++面试】迭代器失效是什么?vector、list、map中如何避免迭代器失效
c++·算法·面试
沐欣工作室_lvyiyi1 小时前
基于单片机的跑步机控制系统设计(论文+源码)
c语言·单片机·嵌入式硬件·课程设计·keil·跑步机设计