嵌入式学习-02_数据结构和算法 (栈)

嵌入式学习-02_数据结构和算法 (栈)

1 线性结构之栈

1.1 栈的定义

栈(stack),是限制在只能在表的一端进行插入和删除操作的线性表。应用范围非常广泛。生活中也有栈的场景,比如堆叠的盘子、报 ,电梯中的人们,邮局的邮筒等。

特点:后进先出 (LIFO,Last In First Out)或先进后出 (FILO,First In Last Out)的线性表。

在这里插入图片描述

1.2 相关概念

- 栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。栈顶由一个称为栈顶指针的位置指示器(其实就是一个变量)来指示,它是动态变化的。

- 栈底(Bottom):是固定不变的,不允许进行插入和删除的一端,又称为表头

- 空栈:不含任何元素的空表。

- 设栈S=(a1,a2,…,an ),则a1称为栈底元素,an为栈顶元素,栈中元素按a1,a2,…,a_n的次序进栈(压栈、push),出栈(弹栈,pop)的第一个元素应为栈顶元素,出栈顺序为:an,…,a2,a1。

*情况1:初始情况top = -1。*

在这里插入图片描述

*情况2:初始情况top = 0。*

在这里插入图片描述

1.3 栈的使用举例

#include <stdio.h>
#include <stdlib.h>

// 定义栈中元素的类型别名
typedef int element_t;

// 定义栈结构体
typedef struct
{
    element_t *data; // 存储栈中的元素,指向一块连续存储的内存空间
    size_t capacity; // 容量
    size_t size;     // 已添加的元素个数
} Stack;

/**
 * @brief 初始化栈
 * @param Stack *stack
 * @param size_t initCapacity
 */
void initStack(Stack *stack, size_t initCapacity)
{
    // 开辟连续的内存空间
    stack->data = (element_t *)malloc(sizeof(element_t) * initCapacity);
    // 初始化成员
    stack->capacity = initCapacity;
    stack->size = 0;
}

/**
 * @brief 返回栈内元素个数
 * @param const Stack *stack
 */
size_t getSize(const Stack *stack)
{
    return stack -> size;
}

/**
 * @brief 入栈(添加元素)
 * @param Stack *stack
 * @param element_t element
 */
void pushStack(Stack *stack, element_t element)
{
    // 如果容量已满,扩展
    if (stack->size == stack->capacity)
    {
        stack->capacity *= 2;
        stack->data = realloc(stack->data, sizeof(element_t) * stack -> capacity);
    }

    // 在最后一个位置添加新元素
    stack->data[stack->size] = element;
    // 元素数量自增
    stack->size++;
}

//
/**
 * @brief 出栈(删除元素)
 * @param Stack *stack
 * @param element_t *deleted_element 用于存储被删除的元素
 */
void popStack(Stack *stack, element_t *deleted_element)
{
    // 如果是空栈,直接退出
    if (stack->size == 0)
    {
        return;
    }

    // 将被删除的元素存储下来
    *deleted_element = stack->data[stack->size - 1];

    // 删除最后一个元素,不用真删除,元素数量自减
    stack->size--;
}

/**
 * @brief 释放栈内存
 * @param Stack *stack
 */
void destroyStack(Stack *stack)
{
    free(stack->data);
    stack->capacity = 0;
    stack->size = 0;
}

/**
 * @brief 遍历栈中的数据
 * @param Stack *stack
 */
void printStack(Stack *stack)
{
    for (size_t i = 0; i < stack->size; i++)
    {
        printf("%d ", stack->data[i]);
    }
}

int main()
{

    // 定义栈结构
    Stack stack;

    // 初始化
    initStack(&stack, 10);

    // 入栈
    pushStack(&stack, 100);
    pushStack(&stack, 200);
    pushStack(&stack, 300);
    pushStack(&stack, 400);
    pushStack(&stack, 500);
    pushStack(&stack, 600);
    pushStack(&stack, 700);
    pushStack(&stack, 800);
    pushStack(&stack, 900);
    pushStack(&stack, 1000);
    pushStack(&stack, 1100);

    // 出栈
    element_t num;
    popStack(&stack, &num);
    printf("元素 %d 出栈\n", num);
    popStack(&stack, &num);
    printf("元素 %d 出栈\n", num);
    printf("\n");

    printf("栈内元素数量:%zu \n", getSize(&stack));
    printStack(&stack);

    // 释放栈内存
    destroyStack(&stack);
    return 0;
}

栈\n", num);
printf(“\n”);

printf("栈内元素数量:%zu \n", getSize(&stack));
printStack(&stack);

// 释放栈内存
destroyStack(&stack);
return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路x飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值