数据结构——栈

目录

概念与结构

栈底层结构选型

数组

链表

使用数组实现栈

​编辑

初始化栈

判断栈空

入栈

出栈

取栈顶元素

栈的元素个数

销毁


概念与结构

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

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

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

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

栈底层结构选型

数组

链表

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

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

使用数组实现栈

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

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;
}
相关推荐
hnjzsyjyj38 分钟前
洛谷 P1443:马的遍历 ← BFS
数据结构·bfs
做时间的朋友。1 小时前
精准核酸检测
java·数据结构·算法
如君愿1 小时前
考研复习 Day28 | 习题--计算机网络第四章(网络层 中)、数据结构(树与二叉树 下)
数据结构·计算机网络·考研·课后习题·记录考研
江南十四行2 小时前
排序算法进阶:直接插入排序(简单排序)与希尔排序
数据结构·算法·排序算法
洛水水2 小时前
【Redis入门】一篇详解Redis五大数据结构
数据结构·数据库·redis
CoderCodingNo2 小时前
【CSP】CSP-J 2021真题 | 插入排序 luogu-P7910 (适合GESP四-六级及以上考生练习)
数据结构·算法·排序算法
努力努力再努力wz3 小时前
【MySQL进阶系列】一文打通事务机制:从锁、Undo Log 到 MVCC 与隔离级别
c语言·数据结构·数据库·c++·mysql·算法·github
薇茗3 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树1
c语言·数据结构·算法
澈2073 小时前
C++ string全面解析:从入门到精通
数据结构·c++·算法
Irissgwe3 小时前
算法之滑动窗口
数据结构·算法