顺序栈————遍历、出栈、入栈 (基于C语言实现)

以数组作为基础实现栈空间(顺序栈)

数组在内存中占用一块连续的空间,也就是数组元素的内存地址是连续的。为了实现栈,一般是把数组头作为栈底,数组头部到数组尾部作为栈的增长方向,也就是用户只在数组尾部对数据进行插入和删除。

  • 为了方便管理顺序栈所以需要构造管理顺序栈信息的结构体类型,用于记录重要参数,如下:
    Bottom:记录栈底地址
    Size :记录栈容量
    Top :记录栈顶元素下标 (为-1则栈空)

image

以下是我的函数接口:

定义顺序栈中的元素的数据类型

// 指的是顺序栈中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;

构造记录顺序栈SequenceStack各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体

// 构造记录顺序栈SequenceStack各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
typedef struct SequenceStack
{
    DataType_t *Bottom; // 记录栈底地址
    unsigned int Size;  // 记录栈容量
    int Top;            // 记录栈顶元素的下标

} SeqStack_t;

创建顺序表并对顺序栈进行初始化

/******************************************************
 *
 *  name      : SeqStack_Create
 *	function  : 创建顺序表并对顺序栈进行初始化
 *  argument
 *              @size :顺序栈的容量
 *
 *  retval    : 顺序栈的地址
 *  author    : Dazz
 *  date      : 2024/4/25
 *  note      : None
 *
 * *******************************************************/
SeqStack_t *SeqStack_Create(unsigned int size)
{
    // 1.利用calloc为顺序栈的管理结构体申请一块堆内存
    SeqStack_t *Manager = (SeqStack_t *)calloc(1, sizeof(SeqStack_t));

    if (NULL == Manager)
    {
        perror("calloc memory for manager is failed");
        exit(-1); // 程序异常终止
    }

    // 2.利用calloc为所有元素申请堆内存
    Manager->Bottom = (DataType_t *)calloc(size, sizeof(DataType_t));

    if (NULL == Manager->Bottom)
    {
        perror("calloc memory for Stack is failed");
        free(Manager);
        exit(-1); // 程序异常终止
    }

    // 3.对管理顺序栈的结构体进行初始化(元素容量 + 最后元素下标)
    Manager->Size = size; // 对顺序栈中的容量进行初始化
    Manager->Top = -1;    // 由于顺序栈为空,则栈顶元素的下标初值为-1

    return Manager;
}

判断顺序栈是否已满

/******************************************************
 *
 *  name      : SeqStack_IsFull
 *	function  : 判断顺序栈是否已满
 *  argument
 *              @Manager :顺序栈的地址
 *
 *  retval    : 顺序栈已满返回1,否则返回0
 *  author    : Dazz
 *  date      : 2024/4/25
 *  note      : None
 *
 * *******************************************************/
bool SeqStack_IsFull(SeqStack_t *Manager)
{
    return (Manager->Top + 1 == Manager->Size) ? true : false;
}

入栈

/******************************************************
 *
 *  name      : SeqStack_Push
 *	function  : 入栈
 *  argument
 *              @Manager :顺序栈的地址
 *              @Data    :入栈的数据
 *
 *  retval    : 顺序栈已满返回1,否则返回0
 *  author    : Dazz
 *  date      : 2024/4/25
 *  note      : None
 *
 * *******************************************************/
bool SeqStack_Push(SeqStack_t *Manager, DataType_t Data)
{
    // 1.判断顺序栈是否已满
    if (SeqStack_IsFull(Manager))
    {
        printf("SeqStack Full is Full!\n");
        return false;
    }

    // 2.如果顺序栈有空闲空间,则把新元素添加到顺序栈的栈顶
    Manager->Bottom[++Manager->Top] = Data;

    return true;
}

判断顺序栈是否为空

/******************************************************
 *
 *  name      : SeqStack_IsEmpty
 *	function  : 判断顺序栈是否为空
 *  argument
 *              @Manager :顺序栈的地址
 *
 *  retval    : 顺序栈为空返回1,否则返回0
 *  author    : Dazz
 *  date      : 2024/4/25
 *  note      : None
 *
 * *******************************************************/
bool SeqStack_IsEmpty(SeqStack_t *Manager)
{
    return (-1 == Manager->Top) ? true : false;
}

出栈

/******************************************************
 *
 *  name      : SeqStack_Pop
 *	function  : 出栈
 *  argument
 *              @Manager :顺序栈的地址
 *
 *  retval    : 出栈的数据
 *  author    : Dazz
 *  date      : 2024/4/25
 *  note      : None
 *
 * *******************************************************/
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{
    DataType_t temp = 0; // 用于存储出栈元素的值

    // 1.判断顺序栈是否为空
    if (SeqStack_IsEmpty(Manager))
    {
        printf("SeqStack is Empty!\n");
        return;
    }

    // 2.由于删除了一个元素,则需要让顺序栈的栈顶元素下标-1
    temp = Manager->Bottom[Manager->Top--];

    return temp;
}

遍历并打印每个数据

/******************************************************
 *
 *  name      : SeqStack_Print
 *	function  : 遍历并打印每个数据
 *  argument
 *              @Manager :顺序栈的地址
 *
 *  retval    : None
 *  author    : Dazz
 *  date      : 2024/4/25
 *  note      : None
 *
 * *******************************************************/
void SeqStack_Print(SeqStack_t *Manager)
{
    if (-1 == Manager->Top)
    {
        printf("栈为空\n");
        return;
    }

    for (int i = 0; i <= Manager->Top; ++i)
    {
        printf(" Stack Element[%d] = %d\n", i, Manager->Bottom[i]);
    }
}
posted @   Dazz_24  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示