文章目录
栈的存储方式为后进先出LIFO(Last In Firet Out),我们可以将其理解为手枪的弹夹,放入子弹的过程叫压栈,出去的过程叫出栈。我们可以和我们之前创建出顺序表和链表的特性得出压栈和出栈适合的为尾插尾删,所以我们使用数组的方式来。
一、栈是什么?
将元素压栈放入后,再将后放入的先出栈,满足这种结构的就是栈。
二、使用步骤
1.创建变量
因为我们使用数组的方式,所以创建的变量和顺序表相同,
代码如下(示例):
typedef int typedata;
typedef struct Stack
{
typedata* data;
int size;
int capicity;
}Stack;
2.初始化栈
和顺序表相同,初始化开辟一定的空间。
代码如下(示例):
void InitStack(Stack* sl)
{
assert(sl);
sl->data = (typedata*)malloc(sizeof(typedata) * 4);
if (sl->data == NULL)
{
perror("malloc fail");
return;
}
sl->capicity = 4;
sl->size = 0;
}
3.压栈实现
实现顺序表的尾插,记得检查空间如果空间已满要记得增容。
代码如下(示例):
void capicity(Stack* sl)
{
assert(sl);
if (sl->capicity == sl->size)
{
typedata* newnode = realloc(sl->data, sl->capicity * sizeof(typedata) * 2);
if (newnode == NULL)
{
perror("realloc fail");
return;
}
sl->data = newnode;
sl->capicity *= 2;
}
}
void Stackpush(Stack* sl, typedata data)
{
assert(sl);
capicity(sl);
sl->data[sl->size] = data;
sl->size++;
}
4.出栈实现
出栈就是顺序表的尾删只需要减小size的大小即可。
代码如下(示例):
void Stackpop(Stack* sl)
{
assert(sl);
assert(!Empty(sl));
sl->size--;
}
5.栈的销毁
既然开辟了空间就一定要释放空间,我们直接将数组free将其置空,容量和大小全部归零。
代码如下(示例):
void Destory(Stack* sl)
{
assert(sl);
free(sl->data);
sl->data == NULL;
sl->capicity = 0;
sl->size = 0;
}
6.栈顶的数据
因为栈是压入的,所以最先进入的栈会被压到下面,所以栈顶的数据就为当前最后压入的栈。
代码如下(示例):
typedata topdata(Stack* sl)
{
assert(sl);
return sl->data[sl->size - 1];
}
7.判断栈是否为空
看栈的size是否为0,如果为0就为空返回true,反之不为空返回false。
代码如下(示例):
bool Empty(Stack* sl)
{
if (sl->size == 0)
{
return true;
}
return false;
}
8.栈的打印
打印栈的化我们可以通过循环从零开始遍历,然后小于size,因为栈下标的最后为size-1。
代码如下(示例):
void Printstack(Stack* sl)
{
assert(sl);
int i = 0;
for (i = 0; i < sl->size; i++)
{
printf("%d ", sl->data[i]);
}
}
9.栈执行结果
总结
栈因为它特殊的增删方式,使其适合使用数组的形式,它就如同弹夹一样,先进去的后出来,而后进去的先出来,希望这篇文章对您有所帮助。