数据结构 - 栈

一.什么是栈?

栈是一种特殊的线性表,它只允许在一端进行插入元素和删除的操作。可以进行插入和删除的一端叫做栈顶,另一端叫做栈底。

二.栈的底层结构

链表和数组都可以作为栈的底层结构,相对而言数组更适合作为栈的底层结构,因为数组在尾上插入数据的代价比较小。

三.栈结构的定义

复制代码
typedef int STDataType;
typedef struct Stack
{
	STDataType* arr;//是结构体里的指针成员,保存动态数组的首地址,栈的数据就存在那个数组里。
	int top;//有效元素数量。
	int capacity;//栈的容量,是元素个数不是字节。
}ST;

四.栈的初始化

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

五.入栈.

接受栈指针ps和待入栈元素x,先判断有效元素数量top和栈的容量capacity是否相等,若栈满就用realloc函数扩容(初始容量扩为4后续每次翻倍),扩容失败就打印错误并退出程序,罗容后更新栈的数组指针和容量,最后把元素x放到top下标位置,然后top在自增。

复制代码
void StackPush(ST* ps, STDataType x)
{
	if (ps->top == ps->capacity)
	{
		//增容
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));//总字节
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;//realloc函数的返回值-->返回新内存块的首地址。
		ps->capacity = newCapacity;
	}
	//先把x放到top下标位置然后top++。
	ps->arr[ps->top++] = x;
}

六.判断栈是否为空

复制代码
bool StackEmpty(ST* ps)
{
	//断言:防止空指针传入,ps为NULL直接报错。
	assert(ps);
	//top等于0代表栈没有有效元素,返回true(空),否则返回false(非空)。
	return ps->top == 0;
}

七.出栈

先用断言判断栈不为空,防止对空栈进行出栈操作,出栈并不删除数组里的数据,只需将代表栈的个数的top变量前置减一,相当于把栈顶的有效元素范围向前收缩一位,然后出栈。

复制代码
void StackPop(ST* ps)
{
	//断言:栈不能为空。
	assert(!StackEmpty(ps));
	//然后在出栈。
	--ps->top;
}

八.取栈顶元素

先用断言判断栈不为空,避免空栈读取数据,top代表下一个代存入元素的下标,所以栈顶的有效元素存放在下标top-1处,函数直接返回这个位置的数据,只读取栈顶的值,不会修改 top,也不会删除栈中的元素。

复制代码
STDataType StackTop(ST* ps)
{
	assert(!StackEmpty(ps));
	return ps->arr[ps->top - 1];
}

九.获取栈的有效元素个数

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

十.销毁栈

复制代码
void StackDestroy(ST* ps)
{
	if (ps->arr)
		free(ps->arr);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}
相关推荐
wanderist.19 分钟前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.30 分钟前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
Escalating_xu1 小时前
【C 语言】深入理解指针(5):sizeof、strlen、数组名语义与指针笔试题全解析
java·c语言·开发语言
小雪崩2 小时前
嵌入式学习 day61-62:IMX6ULL驱动——系统移植
学习
Code_Solitude2 小时前
c语言:递归
java·c语言·算法
程序员清风2 小时前
哈希表:从键值映射到高效查找
数据结构·哈希算法·散列表
一隅论数智2 小时前
OWL(Web Ontology Language)介绍与使用举例(二)
大数据·经验分享·笔记·学习·自然语言处理·学习方法·政务
我命由我123452 小时前
Photoshop - Photoshop 使用内容识别填充移除对象
学习·职场和发展·产品运营·求职招聘·职场发展·学习方法·photoshop
万年咸鱼2 小时前
解决C语言的内存释放机制
java·c语言·python
梓雨枔3 小时前
JavaScript+快速学习,简单好用~
javascript·学习