数据结构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));
}
相关推荐
祖力553 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
WWJA王文举5 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
白狐_7986 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2587 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
qq_448011167 小时前
C语言中的动态内存分配
c语言·开发语言·php
船厂电气自动化ai大模型8 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
动词ing8 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
旖旎夜光8 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
小雨笙笙9 小时前
C语言:变量三属性——存储类型
c语言·开发语言
Navigator_Z10 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode