【C数据结构】栈_Stack

目录

栈_Stack

【1】栈的概念及结构

【2】栈的实现

【1.1】栈数据结构的接口

【1.2】栈的初始化

【1.3】栈的释放

【1.4】入栈

【1.5】出栈

【1.6】获取栈顶数据

【1.8】获取栈中的有效元素个数

【1.9】检测栈是否为空


栈_Stack

【1】栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

栈:后进先出(Last In Firsh Out)

【C数据结构】栈_Stack_第1张图片

【2】栈的实现

        栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

【C数据结构】栈_Stack_第2张图片

        如果有特定场合要用链表作为栈的实现,那我们应该将头和尾巴翻过来,示意图:

【C数据结构】栈_Stack_第3张图片

【C数据结构】栈_Stack_第4张图片

【1.1】栈数据结构的接口

#pragma once
#include 
#include 
#include 
#include 

// 栈数据结构定义 ///
/* 栈数据结构 */
typedef int STDataType;
typedef struct Stack {
    STDataType* _buffer;
    size_t _top;
    size_t _capacity;
}ST;


// 栈常用接口定义 ///
/* 栈:初始化 */
void StackInit(ST* pSt);

/* 栈:销毁 */
void StackDestory(ST* pSt);

/* 栈:入栈 */
void StackPush(ST* pSt, STDataType val);

/* 栈:出栈 */
void StackPop(ST* pSt);

/* 栈:获取栈顶数据 */
STDataType StackTop(ST* pSt);

/* 栈:获取栈中有效元素个数 */
size_t StackSize(ST* pSt);

/* 栈:检查是否为空栈 */
bool StackEmpty(ST* pSt);

【1.2】栈的初始化

/* 栈:初始化 */
void StackInit(ST* pSt) {
    // 断言
    assert(pSt);

    // 初始化
    pSt->_buffer = NULL;
    pSt->_top = pSt->_capacity = 0;
}

【1.3】栈的释放

/* 栈:销毁 */
void StackDestory(ST* pSt) {
    // 断言
    assert(pSt);

    // 销毁内存,初始化变量
    free(pSt->_buffer);    pSt->_buffer = NULL;
    pSt->_top = pSt->_capacity = 0;
    pSt = NULL;
}

【1.4】入栈

入栈动图演示

【C数据结构】栈_Stack_第5张图片

入栈的两种情况

【C数据结构】栈_Stack_第6张图片

/* 栈:入栈 */
void StackPush(ST* pSt, STDataType val) {
    // 断言
    assert(pSt);

    // 检查容量
    if (pSt->_top == pSt->_capacity) {
        size_t newCapacity = pSt->_capacity == 0 ? 4 : pSt->_capacity * 2;
        STDataType* pTemp = (STDataType*)realloc(pSt->_buffer, sizeof(STDataType) * newCapacity);
        // 开辟失败
        if (pTemp == NULL) {
            perror("realloc fail!");
            exit(-1);
        }

        // 开辟成功
        pSt->_buffer = pTemp; pTemp = NULL;
        pSt->_capacity = newCapacity;
    }

    // 数据入栈
    pSt->_buffer[pSt->_top] = val;
    pSt->_top++;
}

【1.5】出栈

出栈动图演示

【C数据结构】栈_Stack_第7张图片

/* 栈:出栈 */
void StackPop(ST* pSt) {
    // 断言
    assert(pSt);
    assert(!StackEmpty(pSt));

 pSt->_top--;
}

【1.6】获取栈顶数据

/* 栈:获取栈顶数据 */
STDataType StackTop(ST* pSt) {
    // 断言
    assert(pSt);
    assert(!StackEmpty(pSt));

    return pSt->_buffer[pSt->_top - 1];
}

【1.8】获取栈中的有效元素个数

/* 栈:获取栈中有效元素个数 */
size_t StackSize(ST* pSt) {
    // 断言
    assert(pSt);

    return pSt->_top;
}

【1.9】检测栈是否为空

/* 栈:检查是否为空栈 */
bool StackEmpty(ST* pSt) {
    // 断言
    assert(pSt);

    return pSt->_top == 0;
}

你可能感兴趣的:(C,数据结构,c语言,数据结构)