数据结构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));
}
相关推荐
重生之后端学习1 天前
287. 寻找重复数
数据结构·算法·leetcode·深度优先·图论
炘爚1 天前
C语言(const的指针定义的区别)
c语言
一只小灿灿1 天前
六大主流编程语言数据类型底层深度解析:从硬件寄存器到内存布局、编译运行与跨平台本质(超全底层版)
数据结构
今儿敲了吗1 天前
46| FBI树
数据结构·c++·笔记·学习·算法
Z9fish1 天前
sse哈工大C语言编程练习47
c语言·数据结构·算法
愣头不青1 天前
560.和为k的子数组
java·数据结构
本喵是FW1 天前
C语言手记2
c语言·开发语言
WolfGang0073211 天前
代码随想录算法训练营 Day14 | 二叉树 part04
数据结构·算法
计算机安禾1 天前
【C语言程序设计】第34篇:文件的概念与文件指针
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
会编程的土豆1 天前
【数据结构与算法】 二叉树做题
开发语言·数据结构·c++·算法