数据结构8:栈

文章目录

简介

栈是一种类似于枪弹夹一样的数据结构,先进入的最后弹出,后进入的先弹出,如图1所示。栈栈分为栈顶和栈底,栈只允许对栈顶进行操作,从而决定了栈是先进后出的数据结构。

入栈:向栈中添加元素的操作叫做入栈或者压栈,如图2所示。

出栈:从栈中取出元素的操作叫做出栈或者弹栈,如图3所示。

栈的数据结构和API函数:

我们教程中的栈是以线性表为基础实现的,因此栈的数据结构与线性表是一样的,栈的API也是在线性表的基础上实现的。简单的说,栈就是只允许在最前端操作的线性表,只需要在最前端插入元素和取出元素。为了简单方便,我们以单向链表为基础实现栈及其API函数。

栈的数据结构

//将线性表的数据结构定义为栈

c 复制代码
typedef  List Stack;

栈的API函数

栈生成函数:

c 复制代码
Stack *StackCreate()
{
	//定义一个Stack类型的指针
	Stack *temp = NULL;
	//利用ListCreate给分配栈空间
	temp = (Stack *)ListCreate();
	//返回栈指针
	return temp;
}

应用代码

c 复制代码
Stack *mystack = NULL;
//建立一个栈
mystack = StackCreate();

栈销毁函数:

c 复制代码
int StackDestroy(Stack **stack)
{
	int ret;
	//利用ListDestory销毁Stack
	ret = ListDestory(stack);
	//返回操作的结果
	return ret;
}

应用代码:

c 复制代码
StackDestroy(&mystack);

栈清空函数:

c 复制代码
int StackClear(Stack *stack)
{
	int ret;
	//利用ListClear清空Stack
	ret = ListClear(stack);
	//返回操作的结果
	return ret;
}

应用代码:

c 复制代码
StackClear(&mystack);

栈长度获取函数:

c 复制代码
int StackGetlen(Stack *stack)
{
	int ret;
	//利用ListGetLength获取栈长度
	ret = ListGetLength(stack);
	//返回栈的长度
	return ret;
}

应用代码:

c 复制代码
len = StackGetlen(mystack);

栈空检测函数:

c 复制代码
int StackEmpty(Stack *stack)
{
	int len;
	//获取栈的长度
	len = StackGetlen(stack);
	//如果长度为0,说明栈为空,返回1
	if (len==0)
	{
		return 1;
	}
	return 0;
}

应用代码:

c 复制代码
printf("StackEmpty:%d\n", StackEmpty(mystack));

栈满检测函数:

c 复制代码
int StackFull(Stack *stack)
{
	int len;
	len = StackGetlen(stack);
	if (len == xx)
	{
		return 1;
	}
	return 0;
}

占满函数与栈空函数类似,也是根据长度来判断的,因为我们使用的线性表是单向链表,元素可以动态地增加,因此无法判断其何时为满;当采用的线性表为顺序表时,该函数才有意义;也可以自己设定一个最大长度,当栈内元素等于该值时,无法插入元素,从而实现栈满,本文对此不做过多阐述。

元素入栈函数:

c 复制代码
int StackPush(Stack *stack, int data)
{
	int ret;
	//利用ListAdd在栈首部插入元素
	ret =ListAdd(stack,0,data);
	//返回操作的结果
	return ret ;
}

应用代码:

c 复制代码
for (i = 0; i < 5;i++)
{
		StackPush(mystack,i);
}

元素出栈函数:

c 复制代码
int StackPop(Stack *stack)
{
	int ret;
	int data;
	//利用ListDelete在栈首部取出元素
	ret = ListDelete(stack,0,&data);
	//如果操作无误,返回数据,否则返回-1
	if (ret == 0)
	{
		return data;
	}
	return -1;
}

应用代码:

c 复制代码
for (i = 0; i < 5; i++)
{
	printf("%d:%d\n", i, StackPop(mystack));
}
相关推荐
卡里笔记几秒前
C语言版2048小游戏
c语言
梵刹古音15 分钟前
【C语言】 循环结构
c语言·开发语言·算法
bbq粉刷匠22 分钟前
Java-排序2
java·数据结构·排序算法
皮皮哎哟23 分钟前
冒泡排序与数组传递全解析 一维二维指针数组及二级指针应用指南
c语言·算法·冒泡排序·二维数组·指针数组·传参·二级指针
蒸蒸yyyyzwd26 分钟前
c网络编程学习笔记
c语言·网络·学习
烟花落o35 分钟前
贪吃蛇及相关知识点讲解
c语言·前端·游戏开发·贪吃蛇·编程学习
头发还没掉光光35 分钟前
Linux 高级 IO 深度解析:从 IO 本质到 epoll全面讲解
linux·服务器·c语言·c++
TracyCoder1231 小时前
Redis 进阶之路:探秘事务、Lua 与特殊数据结构
数据结构·redis·lua
No0d1es1 小时前
电子学会青少年软件编程(C语言)等级考试试卷(一级)2025年12月
c语言·青少年编程·等级考试·电子学会·一级
睡一觉就好了。1 小时前
归并排序——递归与非递归的双重实现
数据结构·算法·排序算法