唤起“栈”的回忆
今夜闻雨来,闲敲博客落灯花!
目录
栈的概念和结构:
栈的创建和初始化:
入栈:
出栈:
栈的销毁:
结语:
栈的概念和结构:
简单来说,栈是一种特殊的顺序表,分为栈顶(top)和栈底,进入数据插入和删除发生在栈顶,了解栈的时候,我们经常会听到压栈和出栈两个词
压栈:栈的插入的插入操作,入数据在栈顶;
出栈:栈的删除操作,出数据也在栈顶;
当我们讨论它的结构时,它属于后进先出,如下图:
栈的创建和初始化:
我们按之前一样,我们先定义一个结构体,结构体包括动态数组,栈顶和容量
typedef int STDataType;
typedef struct Stack
{
STDataType* a;//动态数组
int top;//栈顶
int capacity;//容量
}Stack;
void StackInit(Stack* ps)
{
assert(ps);
ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);//初始化4个空间
ps->top = 0;//无元素
ps->capacity = 4;
}
入栈:
先检查容量是否已满,不满,则增容,加入元素时,是在栈顶加入的,所以我们只需改变栈顶即可
void StackPush(Stack* ps, STDataType x)
{
assert(ps);
if (ps->capacity == ps->top)//检查容量
{
STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);
if (tmp == NULL)
{
perror("realloc fail");
return;
}
ps->a = tmp;
ps->capacity *= 2;//扩容
}
ps->a[ps->top] = x;//存入栈顶
ps->top++;//将栈顶上移
}
出栈:
先检测是否为空,如果不为空,我们只需将其变为有效个数,即可了
bool StackEmpty(Stack* ps)
{
assert(ps);
return ps->top == 0;
}
void StackPop(Stack* ps)
{
assert(ps);
assert(!StackEmpty(ps));//检测栈是否为空
ps->top--;//将栈下移
}
栈的销毁:
将开辟的空间释放掉,同时将其他变量置为0
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->a);//释放掉a开辟的空间
ps->a = NULL;
ps->top = 0;//置为0
ps->capacity = 0;
}
结语:
谢谢观看!