前言
栈是一种特殊的线性表,只允许在固定的一端进行插入和删除的操作,进行数据插入和删除的一端叫做栈顶,另一端叫做栈底。 栈中的数据元素遵循后进先出的的原则。
目录
1.压栈和出栈
2. 栈的实现
3.测试代码
1.压栈和出栈
压栈:栈的插入操作叫 压栈,入数据在栈顶。
弹栈:栈的删除操作叫做出栈。出数据也在栈顶。
如图:
2. 栈的实现
//stack.h
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<stdbool.h>
typedef int SDataType;
typedef struct Stack
{
SDataType* _a;
int _top;//栈顶数据
int _capacity;//容量
}Stack;
void StackInit(Stack* st);//初始化栈
void StackDestory(Stack* st);//销毁栈
void StackPush(Stack* st, SDataType data);//入栈
void StackPop(Stack* st);//出栈
size_t StackSize(Stack* st);//获取栈中元素的数目
SDataType StackTop(Stack* st);//获取栈顶元素
bool StackEmpty(Stack* st);//判断栈是否为空
//stack.c
void StackInit(Stack* st)//初始化栈
{
st->_a = (SDataType*)malloc(sizeof(SDataType) * 4);
//申请空间
//初始化数据
st->_capacity = 4;
st->_top = 0;
}
void StackDestory(Stack* st)//销毁栈
{
free(st->_a);//释放空间
st->_capacity = st->_top = 0;
}
void StackPush(Stack* st, SDataType data)//入栈
{
assert(st);//判断指针是否存在
if (st->_capacity == st->_top)
{
//空间满了需要增容
st->_capacity *= 2;
SDataType* p = (SDataType *)realloc(st->_a, st->_capacity * sizeof(SDataType));
if (p == NULL)
{
printf("内存不足\n");
exit(-1);
}
st->_a = p;
}
st->_a[st->_top] = data;
++(st->_top);
}
void StackPop(Stack* st)//出栈
{
assert(st);//确保指针存在
assert(st->_top > 0);
--(st->_top);
}
size_t StackSize(Stack* st)//获取栈中元素的数目
{
assert(st);//确保指针存在
size_t size = 0;
return size = st->_top;
}
SDataType StackTop(Stack* st)//获取栈顶元素
{
return st->_a[(st->_top) -1 ];
}
bool StackEmpty(Stack* st)//判断栈是否为空
{
return !st->_top;
}
3.测试代码
void TestStack()
{
Stack st;
StackInit(&st);
StackPush(&st, 1);
StackPush(&st, 2);
StackPush(&st, 3);
StackPush(&st, 4);
StackPush(&st, 5);
StackPush(&st, 6);
StackPush(&st, 7);
StackPush(&st, 8);
while (!StackEmpty(&st))
{
printf("%d ", StackTop(&st));
StackPop(&st);
}
StackDestory(&st);
}