数据结构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));
}
相关推荐
bubiyoushang88814 分钟前
MATLAB实现雷达恒虚警检测
数据结构·算法·matlab
wu_asia18 分钟前
编程技巧:如何高效输出特定倍数数列
c语言·数据结构·算法
你怎么知道我是队长29 分钟前
C语言---无名位域
c语言·开发语言
星火开发设计1 小时前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——力扣 394 题:字符串解码
数据结构·c++·结构与算法
栈与堆2 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
-森屿安年-2 小时前
unordered_map 和 unordered_set 的实现
数据结构·c++·散列表
txinyu的博客3 小时前
map和unordered_map的性能对比
开发语言·数据结构·c++·算法·哈希算法·散列表
im_AMBER3 小时前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
予枫的编程笔记3 小时前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法