数据结构之栈(数组实现)

数据结构之栈

一、栈的概念与结构。

1、概念:栈是限定仅在表尾进行插入和删除操作的线性表。栈中的数据元素遵守后进先出原则,即LIFO(Last In First Out)的原则。

2、栈的插入操作:进栈/压栈/入栈

​ 栈的删除操作: 出栈/弹栈

3、进栈出栈的变化形式(重要)

我们想一下,是否最先进栈的元素,就只能最后出栈呢?

其实不然。举例如下:

例如:我们现在要将1、2、3依次进栈,那么会出现哪些出栈顺序呢?

(1)1、2、3一次进栈,再出栈,则顺序为:3->2->1

复制代码
(2)1、2先进栈,然后出栈2,再进栈3,再一次出栈,则顺序为:2->3->1

(3)1、2先进栈,然后一次出栈2、1,再进栈3,再出栈3,则顺序为:2->1->3

(4)1进栈,1出栈,2进栈,2出栈,3进栈,3出栈,则顺序为:1->2->3

(5)1进栈,1出栈,2、3进栈,再依次出栈,则顺序为:1->3->2

注意:虽然出栈情况多,但是一定不会出现3->1->2的出栈方式。因为要3出栈,则必须让1、2先进栈,当3出栈时,后续出栈的顺序为2->1,不可能为1->2

二、栈的实现

栈的头文件(Stack.h)

复制代码
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top;		// 栈顶
	int _capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps); 
// 入栈 
void StackPush(Stack* ps, STDataType data); 
// 出栈 
void StackPop(Stack* ps); 
// 获取栈顶元素 
STDataType StackTop(Stack* ps); 
// 获取栈中有效元素个数 
int StackSize(Stack* ps); 
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps); 
// 销毁栈 
void StackDestroy(Stack* ps); 

(1)检查栈空间的容量

复制代码
void CheckCapacity(Stack* ps)
{
	if (ps->size >= ps->capacity)
	{
		ps->capacity *= 2;
		ps->array = (STDataType *)realloc(ps->array, ps->capacity * sizeof(STDataType));
	}
}

(2)栈的初始化

复制代码
void StackInit(Stack* ps)
{
	ps->array = (STDataType *)calloc(DEFSTACKSIZE, sizeof(STDataType));
	ps->capacity = DEFSTACKSIZE;
	ps->size = 0;
}

(3)头插

复制代码
void StackPush(Stack* ps, STDataType x)
{
	CheckCapacity(ps);
	ps->array[ps->size++] = x;
}

(4)尾删

复制代码
void StackPop(Stack* ps)
{
	if (ps->size == 0)
	{
		return;
	}
	ps->size--;
}

(5)返回栈空间的栈顶元素

复制代码
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->size);
	return ps->array[ps->size - 1];
}

(6)判断栈空间元素是否为空

复制代码
int StackEmpty(Stack* ps)
{
	return ps->size == 0;
}

(7)返回栈空间的元素个数

复制代码
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->size;
}

(8)销毁栈空间

c 复制代码
void StackDestory(Stack* ps)
{
	if (ps->array)
	{ 
		free(ps->array);
		ps->array = NULL;
		ps->size = 0;
		ps->capacity = 0;
	}
}
相关推荐
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
CSharp精选营5 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假8 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠9 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦16 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
LDR00617 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
小小工匠17 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
Luminous.17 天前
C语言--day30
c语言·开发语言
玖玥拾17 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽17 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言