数据结构-讲解栈的链表实现

栈的链表实现

为了完成学校假期作业被迫营业,想要整个完整的代码可以评论我私发给你,哈哈哈,仅供参考不喜勿喷,欢迎大佬指点,觉得我写的不错的可以给赞作为鼓励,谢谢

大家好我今天为大家讲的是栈的链表实现。

什么是栈呢?

简单的说栈是限制插入和删除只能在一个位置上进行的表。

栈的结构又是什么样的?

我们可以通过下面这个图了解到,Top位置是栈的末端,叫做栈的顶,而且对站的基本操作有Push(进栈)和Pop(出栈),前者相当于插入,后者相当于删除最后插入的元素

如图所示:
在这里插入图片描述

代码如下:

typedef int ElementType;
typedef struct Node* PtrToNode;
typedef PtrToNode Stack;
struct Node
{
	ElementType Element;
	PtrToNode Next;
};

如何创建出一个(空)栈?

创建一个空栈很简单我们只要创建一个头结点,并将指针域Next指向NULL。其实这里和我们讲的链表头结点创建没什么区别。

思路有了那我们来看一看代码如何实现吧

Stack S;
S = CreateStack();
//创建一个空栈
Stack CreateStack(void)
{
	Stack S;
	S = malloc(sizeof(struct Node));
	if (S == NULL)
		printf("内存申请失败\n");
	S->Next = NULL;
	printf("空栈创建完成\n");
	return S;
}

既然栈(NULL)有了我们就可以讲解两个操作一个是进栈一个是出栈

我们先来说说

数据是如何进栈?

我们可以新生成一个结点,并将数据放在结点的数据域中,再把包装好的结点放入栈中

如图所示:

在这里插入图片描述

代码实现:

void Push(ElementType X, Stack S)
{
	PtrToNode TmpCell;
	TmpCell = malloc(sizeof(struct Node));
	if(TmpCell==NULL)
		printf("内存申请失败\n");
	else
	{
		TmpCell->Element = X;
		TmpCell->Next = S->Next;
		S->Next = TmpCell;
	}
}

这段代码就是实现下面图中的操作:

在这里插入图片描述

数据是如何出栈的呢?

我们前面说过出栈相当于删除最后插入的元素,所以我们直接从栈中拿出我们最后插入的结点不就好了嘛

如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hxkxC6sb-1596886986063)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200808164532403.png)]

代码实现:

//元素出栈
void Pop(Stack S)
{
	PtrToNode FirstCell;
	if (IsEmpty(S))
		printf("空栈什么都没有");
	else
	{
		FirstCell = S->Next;
		S->Next = S->Next->Next;
		free(FirstCell);
	}

}

这段代码就是实现下面图中的操作:

在这里插入图片描述

有没有同学有这种想法:不想元素出栈我们还可以知道栈顶元素是什么 ?我觉得大家一定会有人这么想

那么

返回栈顶元素该如何实现呢?

当然很简单我们可以直接看代码

代码实现:

ElementType Top(Stack S)
{
	if (!IsEmpty(S))
		return S->Next->Element;
	return -1;
}

这样我们就可以知道栈顶元素是什么了?很简单吧

那有没有这种情况就是不小心向栈中放入了错误的数据但是我们想重新输入,重新输入的前提就是清空我们栈中的数据

如何清空栈中的数据?

可以根据链表的清空来写栈的清空代码,思路清晰之后我们来看看

代码实现:

//清空栈
void Delete(Stack S)
{
	printf("开始清空栈:\n");
	if (S == NULL)
	{
		printf("栈是空的不用清理\n");
		return;
	}
	else
	{
		while (!IsEmpty(S))
		{
			Pop(S);
		}
	}
	printf("栈已清空\n");
}

这个段代码我就不细讲了 就是 用循环代替了一个个Pop,机器可以实现的,就不要用人去操作哈哈哈

清空栈之后我们还可以判断一下栈有没有清空成功 我们可以判断一下栈是否为空函数代码如下:

如何判断栈是否为空?

int IsEmpty(Stack S)
{
	return S->Next == NULL;
}

如果栈为空 返回TURE 反之 返回FALSE

这样整个栈的链表实现的知识我们就学完了

程序的执行截图:

在这里插入图片描述
我们一起对这些知识回顾一下这些知识

1.栈是什么
2.构造出一个(空)栈
3.元素进栈
4.元素出栈
5.返回栈顶元素
6.清空栈中的数据
7.判断栈是否为空

你学会了吗?

猜你喜欢

转载自blog.csdn.net/damowangsx/article/details/107884675