数据结构【栈】有哪些应用场景?

数据结构【栈】有哪些应用场景?_第1张图片

✨Blog:不会敲代码的小张:)
推荐专栏:C语言Cpp‍️、数据结构初阶
座右铭:“記住,每一天都是一個新的開始
本章内容:《栈》的介绍✨

前言

本章会介绍栈的特性以及栈的初始化、销毁、插入、删除、取栈顶元素等…

栈的应用场景

那么栈的应用场景有哪些呢?
栈可以达到逆序的功能,利用后进先出的思想。
包括编译器的在对输入的语法进行分析的时候,例如括号的匹配"()“、”{}“、”[]"这些成对出现的符号,借助栈的特性,凡是遇到括号的前半部分,即把这个元素入栈,凡是遇到括号的后半部分就比对栈顶元素是否该元素相匹配,如果匹配,则前半部分出栈,否则就是匹配出错
后续会需要用到栈模拟实现一些知识点,敬请期待。

什么是栈?

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。 它按照后进先出(Last in Firstout)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

数据结构【栈】有哪些应用场景?_第2张图片

目录

  • 前言
    • 栈的应用场景
      • 什么是栈?
  • 栈的创建
  • 栈的初始化
  • 栈的销毁
  • 插入
  • 删除
  • 判断是否为空
  • 栈的大小
  • 取栈顶元素

栈的创建

静态数组,内存开大了浪费,开小了不够用
这里我们选择用动态数组开辟空间,内存不够扩容

typedef int STDataType;
struct Stack
{
	STDataType* data;
	int top;//栈顶
	int capcity;//内存容量
};

栈的初始化

首先malloc一块空间,最开始栈是空的,所以top为0

void STInit(struct Stack* ps) 
{
	assert(ps);

	ps->data = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->data == NULL)
	{
		perror("malloc fail");
		return;
	}
	ps->capcity = 4;//容量
	ps->top = 0;//当前栈顶
}

栈的销毁

void STDestroy(struct Stack* ps)
{
	assert(ps);

	free(ps->data);
	ps->data = NULL;
	ps->capcity = 0;
	ps->top = 0;
}

插入

首先进来就判断栈顶是否和容量相等,如果相等说明空间满了,需要realloc空间,一般增加capcity二倍的容量

void STPush(struct Stack* ps, STDataType x)
{
	assert(ps);
	//扩容
	if (ps->top == ps->capcity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * ps->capcity * 2);
		if(tmp == NULL)
		{
			perror("STPush relloc fail");
			return;
		}
		ps->data = tmp;//把新realloc的空间再赋给ps->data
		ps->capcity = ps->capcity * 2;//更新capcity
	}
	ps->data[ps->top] = x;//插入到栈顶
	ps->top++;//栈顶++
}

删除

记得断言栈不能为空
删除没啥好说的,直接–top就行了,如果下次再插入,会覆盖当前栈顶的值

void STPop(struct Stack* ps)
{
	assert(ps);
	assert(!STEmpty(ps));//断言不能为空

	ps->top--;
}

判断是否为空

top为0说明栈里没有元素,为空

bool STEmpty(struct Stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

栈的大小

先断言栈不能为空
直接返回top就是栈的大小

int STSize(struct Stack* ps)
{
	assert(ps);
	assert(!STEmpty(ps));//断言栈不能为空
	return ps->top;

}

取栈顶元素

同样是先断言栈不能为空,如果为空,就没有元素可取
这里top-1才是栈顶的元素

STDataType STTop(struct Stack* ps)
{
	assert(ps);
	assert(!STEmpty(ps));

	return ps->data[ps->top - 1];
}


如果觉得对你有帮助,希望留下你宝贵的三连!感谢!!!

你可能感兴趣的:(数据结构初阶,数据结构,c语言)