/*************************************************
*
* file name:SqStack.c
* author :momolyl@126.com
* date :2024/04/25
* brief :构建顺序栈
* note :None
*
* CopyRight (c) 2024 momolyl@126.com All Right Reseverd
*
**************************************************/
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
/*************************************************
*
* func name :
* brief :
* func parameter:
*
*
* return :None
* note :None
* func author :momolyl@126.com
* date :2024/04/25
* version :V1.0
**************************************************/
typedef int DataType_t;
typedef struct SqStack // 存储栈的数据(栈底+栈顶+栈容量)
{
DataType_t *Bottom;
unsigned int Size;
int Top;
} SqStack_t;
// 创建一个空的顺序栈
SqStack_t *SqStack_Create(unsigned int size)
{
SqStack_t *Manager = (SqStack_t *)calloc(1, sizeof(SqStack_t));
if (NULL == Manager)
{
perror("calloc memory for manager is failed!\n");
exit(-1);
}
Manager->Bottom = (DataType_t *)calloc(1, sizeof(DataType_t));
if (NULL == Manager->Bottom)
{
perror("calloc memory for Stack is failed!\n");
free(Manager);
exit(-1);
}
Manager->Size = size;
Manager->Top = -1;
return Manager;
}
// 判断栈是否已满
bool SqStack_IsFull(SqStack_t *Manager)
{
if (Manager->Top + 1 == Manager->Size)
return true;
return false;
}
// 新元素从栈顶入栈,即从数组的尾部插入元素
bool SqStack_Push(SqStack_t *Manager, DataType_t Data)
{
// 判断栈是否已满
if (SqStack_IsFull(Manager))
{
printf("SqStack is full!\n");
return false;
}
Manager->Bottom[++Manager->Top] = Data;
return true;
}
// 判断栈是否为空
bool SqStack_IsEmpty(SqStack_t *Manager)
{
if (Manager->Top == -1)
return true;
return false;
}
DataType_t SqStack_Pop(SqStack_t *Manager)
{
DataType_t temp = 0; // 存储出栈元素的值
// 判断栈是否为空
if (SqStack_IsEmpty(Manager))
{
printf("SqStack is empty!\n");
return;
}
temp = Manager->Bottom[Manager->Top--];
return temp;
}
// 遍历顺序栈元素(测试函数)
void SqStack_Print(SqStack_t *Manager)
{
for (int i = 0; i <= Manager->Top; i++)
printf("Stack element[%d]=%d\n", i, Manager->Bottom[i]);
}
int main(void)
{
SqStack_t *Manager = SqStack_Create(5);
SqStack_Push(Manager, 1);
SqStack_Push(Manager, 2);
SqStack_Push(Manager, 3);
SqStack_Push(Manager, 4);
SqStack_Print(Manager);
SqStack_Pop(Manager);
SqStack_Pop(Manager);
SqStack_Print(Manager);
printf("the poped element is %d\n", SqStack_Pop(Manager));
return 0;
}