频鹏凶 发表于 2025-7-5 17:40:35

顺序栈的初始化、入栈、出栈、遍历

/**
* @file name : SeqStack.c
* @brief   :该程序通过堆内存实现顺序栈元素的初始化、入栈、出栈、遍历,另外为了提高可移植性,所以顺序栈中
*               数据元素的类型为DataType_t,用户可以根据实际情况修改顺序表中元素的类型
* @author    :MINDSETT@163.com
* @date      :2025/7/5
* @version   :1.0
* @note      :None
* CopyRight (c)2025MINDSETT@163.comAll Right Reserved
*/

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

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

//构造一个实现顺序表的各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
typedef struct Sequence_Stack
{
    DataType_t *bottom;    //栈底地址
    unsigned intsize;      //栈容量
    int         top;       //栈顶元素的下标
}SeqStack_t;


/**
* @name    :SeqStack_Create
* @brief   :创建一个顺序栈并进行初始化
* @param   :None
* @retval:返回栈底地址
* @date    :2025/7/5
* @version :1.0
* @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\n");
      exit(-1);
    }
    //2.对顺序栈管理结构体的所有元素进行初始化
    manager->bottom=(DataType_t *)calloc(size,sizeof(DataType_t));
    if (NULL == manager->bottom){
      perror("calloc memory for Stack is failed\n");
      exit(-1);
    }
    manager->size=size;
    manager->top=-1;
    return manager;
}


/**
* @name    :SeqStack_IsFull
* @brief   :判断顺序栈是否已满
* @param   :
*            @manager:需要判断的顺序栈
* @retval:已满返回true,未满返回false
* @date    :2025/7/5
* @version :1.0
* @note    :None
*/
bool SeqStack_IsFull(SeqStack_t *manager)
{
    return (manager->top+1==manager->size)? true : false;
}

/**
* @name    :SeqStack_IsEmpty
* @brief   :判断顺序栈是否为空
* @param   :
*            @manager:需要判断的顺序栈
* @retval:为空返回true,不为空返回false
* @date    :2025/7/5
* @version :1.0
* @note    :None
*/
bool SeqStack_IsEmpty(SeqStack_t *manager)
{
    return (-1==manager->top)? true : false;
}

/**
* @name    :SeqStack_Push
* @brief   :入栈
* @param   :
*            @manager:需要操作的顺序栈
*            @Data:需要压入的元素
* @retval:已满返回true,未满返回false
* @date    :2025/7/5
* @version :1.0
* @note    :None
*/
bool SeqStack_Push(SeqStack_t *manager,DataType_t Data)
{
    //判断顺序栈是否已满
    if ( SeqStack_IsFull(manager) ){
      printf("Sequence Stack is Full\n");
      return false;
    }
    //如果顺序栈有剩余空间,则把新元素插入顺序栈的栈顶,并更新管理结构体中最后栈顶的元素下标
    manager->bottom[++manager->top]=Data;
    return true;
}



/**
* @name    :SeqStack_Pop
* @brief   :出栈
* @param   :
*            @manager:需要操作的顺序栈
*            @out:接收弹出的值
* @retval:成功回true,失败返回false
* @date    :2025/7/5
* @version :1.0
* @note    :None
*/
bool SeqStack_Pop(SeqStack_t *manager, DataType_t *out)
{   
    //判断顺序栈是否为空
    if ( SeqStack_IsEmpty(manager) ){
      printf("Sequence Stack is empty\n");
      return false;
    }

    //删除一个元素,栈顶元素下标-1
    *out=manager->bottom;

    return true;
}


/**
* @name    :SeqStack_print
* @brief   :遍历顺序栈
* @param   :
*            @manager:需要操作的顺序栈
* @retval:成功回true,失败返回false
* @date    :2025/7/5
* @version :1.0
* @note    :None
*/
void SeqStack_print(SeqStack_t *manager)
{
   //判断顺序栈是否为空
    if ( SeqStack_IsEmpty(manager) ){
      printf("Sequence Stack is empty\n");
      return;
    }
    //如果顺序栈不为空,则打印顺序栈的元素
    for (int i=0;i<manager->top+1;i++){
      printf("Element[%d]=%d\n",i,manager->bottom);
    }
    printf("\n");
}
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除
页: [1]
查看完整版本: 顺序栈的初始化、入栈、出栈、遍历