数据结构-顺序栈
/**************************************************************************** * @name: sequencelstack * @author: 王玉珩* @date: 2025/10/07** *CopyRight (c) 2025-2026 All Right Reserved* *************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef int DataType_t; //用户自定义指针类型//定义记录顺序栈参数的结构体
typedef struct SequenStack
{DataType_t * Bottom; //栈底地址unsigned int Size; //栈容量int Top; //栈顶元素下标}SeqStack_t; //别名 /**************************************************************************** * @name SeqStackt_Create* @brief 初始化栈* @param unsigned int size:栈容量* * @retval point** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
SeqStack_t * SeqStackt_Create(unsigned int size)
{SeqStack_t *Manager = (SeqStack_t *)calloc(1,sizeof(SeqStack_t)); //申请堆内存,用于管理顺序栈//判断堆内存是否申请成功if (NULL == Manager){perror("calloc memory for Manager is failled");exit(-1); //失败退出程序}Manager->Bottom = (DataType_t *)calloc(size,sizeof(DataType_t)); //为顺序栈申请堆内存//判断堆内存是否申请成功if (NULL == Manager->Bottom){perror("calloc memory for Stack is failled");free(Manager); //失败后释放顺序栈管理内存exit(-1);}Manager->Size = size; //顺序栈容量Manager->Top = -1; //顺序栈栈顶,初值为-1return Manager; //返回用于管理顺序栈的内存地址
}/**************************************************************************** * @name SeqStack_IsFull* @brief 判断顺序栈是否已满* @param Manager:管理体地址* * @retval bool** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
bool SeqStack_IsFull(SeqStack_t *Manager)
{return (Manager->Size - 1 == Manager->Top) ? true : false; //已满返回true,未满返回false
}/**************************************************************************** * @name SeqStack_IsFull* @brief 入栈* @param Manager:管理体地址* * @retval bool** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
bool SeqStack_Push(SeqStack_t *Manager , DataType_t Data)
{if (SeqStack_IsFull(Manager)) //调用SeqStack_IsFull判断顺序表是否已满{ printf("SeqStack Full is Full!\n"); //顺序表已满,退出此函数return false; }Manager->Bottom[++Manager->Top] = Data; //添加元素,实际容量+1 return true;
}/**************************************************************************** * @name SeqStack_Pop* @brief 判断顺序栈是否空* @param Manager:管理体地址* * @retval bool** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
bool SeqStack_IsEmpty(SeqStack_t *Manager)
{return -1 == Manager->Top ? true : false; //已空返回true
}/**************************************************************************** * @name SeqStack_Pop* @brief 出栈* @param Manager:管理体地址* * @retval DataType_t** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{DataType_t temp = 0; //记录弹栈元素的值//调用SeqStack_IsEmpty函数判断顺序栈是否为空,顺序表为空,退出此函数if (SeqStack_IsEmpty(Manager)){printf("SeqStack is Empty!\n"); return ;} temp = Manager->Bottom[Manager->Top--];return temp;
}/**************************************************************************** * @name SeqStack_Print* @brief 遍历* @param Manager:管理体地址* * @retval ** @author https://www.cnblogs.com/yuhengwang* *************************************************************************/
void SeqStack_Print(SeqStack_t *Manager)
{for (int i = 0; i <= Manager->Top; i++){printf("Element[%d]=%d\n",i,Manager->Bottom[i]);}
}int main(int argc,const char * argv[])
{SeqStack_t *Manager = SeqStackt_Create(10);SeqStack_Push(Manager,10);SeqStack_Push(Manager,15);SeqStack_Push(Manager,20);SeqStack_Pop(Manager);SeqStack_Print(Manager);}