数据结构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));
}
相关推荐
CS_Zero3 小时前
C语言sizeof是函数吗?
c语言·开发语言
kiracrimson5 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
心抵鹊6 小时前
归并排序之翻转对(hard)
数据结构·算法
Navigator_Z6 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z7 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode
思麟呀9 小时前
嵌入式入门(一)宏观生态到首次烧录
c语言·嵌入式硬件
白狐_7989 小时前
408 数据结构|红黑树插入:只记两大类
数据结构
小雪崩9 小时前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip
无损检测小白白10 小时前
【嵌入式面试题一】
c语言·单片机
wdfk_prog13 小时前
canopennode-rtt推荐,不只可以做从站,也可以承担主站角色
c语言·开发语言·数据库·学习·算法·深度优先