栈的实现(数组)
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈: 栈的插入操作叫做进栈、压栈、入栈,入数据在栈顶。
出栈: 栈的删除操作叫做出栈。出数据在栈顶。
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优化一些。因为数组在尾上插入数据的代价比较小。
#include <stdio.h>
#include <assert.h>
#include <stdbool.h>
typedef int STDataType;
typedef struct stack
{
STDataType *arr;
int top; //栈顶时,有多少数据,记录存了几个
int capacity;
}ST;
void StackInit(ST *st);
void StackDestory(ST *st);
void StackPush(ST *st, STDataType data);
void StackPrint(ST *st);
void StackPop(ST *st);
STDataType StackTop(ST *st);
int StackSize(ST *st);
bool StackEmpty(ST *st);
int main()
{
ST St;
StackInit(&St);
printf("是否为空:%d\n", StackEmpty(&St));
for(int i = 0; i < 5; i++)
{
StackPush(&St, i * 20);
}
StackPrint(&St);
StackPop(&St);
StackPrint(&St);
printf("栈顶数据:%d\n", StackTop(&St));
printf("栈的大小:%d\n", StackSize(&St));
printf("是否为空:%d\n", StackEmpty(&St));
StackDestory(&St);
// printf("栈顶数据:%d\n", StackTop(&St));
printf("是否为空:%d\n", StackEmpty(&St));
}
//栈的初始化
void StackInit(ST *st)
{
assert(st);
st->arr = NULL;
st->top = st->capacity = 0;
}
//栈的销毁
void StackDestory(ST *st)
{
assert(st);
free(st->arr);
st->arr = NULL;
st->top = st->capacity = 0;
}
//栈的打印
void StackPrint(ST *st)
{
for(int i = 0; i < st->top; i++)
{
printf("arr[%d]=%d \n", i, st->arr[i]);
}
}
//入栈
void StackPush(ST *st, STDataType data)
{
assert(st);
if(st->top == st->capacity)
{
int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
STDataType *tmp = (STDataType *)realloc(st->arr, sizeof(STDataType) * newcapacity);
if(tmp == NULL)
{
printf("realloc fail!\n");
exit(-1);
}
st->arr = tmp;
st->capacity = newcapacity;
}
st->arr[st->top] = data;
st->top++;
}
//出栈
void StackPop(ST *st)
{
assert(st);
assert(st->top > 0);
st->top--;
}
//取栈顶数据
STDataType StackTop(ST *st)
{
assert(st);
assert(st->top > 0);
return st->arr[st->top - 1];
}
//栈的大小
int StackSize(ST *st)
{
assert(st);
return st->top;
}
//栈是否为空
bool StackEmpty(ST *st)
{
assert(st);
return st->top == 0;
}