数据结构——栈

目录

概念与结构

栈底层结构选型

数组

链表

使用数组实现栈

​编辑

初始化栈

判断栈空

入栈

出栈

取栈顶元素

栈的元素个数

销毁


概念与结构

栈是一种特殊的线性表 ,它只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据遵循先进后出的原则

压栈:栈的插入操作叫做压栈/入栈/进栈。

出栈:栈的删除操作叫做出栈。

出数据和入数据都在栈顶。

栈底层结构选型

数组

链表

那么对于数组和链表我们选择哪个比较好呢?

答案是数组。因为链表虽然动态性更强,但是每个操作都需要动态分配结点,内存开销比较大,且频繁分配/释放可能引发内存碎片。而数组尾插尾删的效率更高。

使用数组实现栈

我们就根据顺序表的结构来模拟一遍栈的结构。

cpp 复制代码
typedef int STDataType;
typedef struct stack
{
	STDataType* arr;
	int top;
	int capacity;
}ST;

初始化栈

cpp 复制代码
void STInit(ST* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}

判断栈空

cpp 复制代码
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

入栈

cpp 复制代码
void STCheck(ST* ps)
{
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc failed!");
			exit(1);
		}
		else
		{
			ps->arr = tmp;
			ps->capacity = newcapacity;
		}
	}
}
cpp 复制代码
void STPush(ST* ps, STDataType x)
{
	assert(ps);
	STCheck(ps);
	ps->arr[ps->top++] = x;
}

出栈

cpp 复制代码
void STPop(ST* ps)
{
	assert(ps && ps->arr && !STEmpty(ps));
	ps->top--;
}

注意:删除的空间不能free掉,因为动态开辟的空间不能局部释放。

取栈顶元素

cpp 复制代码
STDataType STTop(ST* ps)
{
    assert(ps && ps->arr && !STEmpty(ps));
	return ps->arr[ps->top-1];
}

栈的元素个数

cpp 复制代码
int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

销毁

cpp 复制代码
void STDestroy(ST* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}
相关推荐
养成系小王5 小时前
四大常用排序算法
数据结构·算法·排序算法
闪电麦坤957 小时前
数据结构:从前序遍历序列重建一棵二叉搜索树 (Generating from Preorder)
数据结构··二叉搜索树
闪电麦坤957 小时前
数据结构:二叉树的遍历 (Binary Tree Traversals)
数据结构·二叉树·
球king7 小时前
数据结构中邻接矩阵中的无向图和有向图
数据结构
野渡拾光9 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
pusue_the_sun17 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
liang_jy1 天前
数组(Array)
数据结构·面试·trae
要做朋鱼燕1 天前
【数据结构】用堆解决TOPK问题
数据结构·算法
秋难降1 天前
LRU缓存算法(最近最少使用算法)——工业界缓存淘汰策略的 “默认选择”
数据结构·python·算法
Jayyih1 天前
嵌入式系统学习Day19(数据结构)
数据结构·学习