嵌入式全栈开发学习笔记---数据结构(链栈)

目录

定义链栈

链栈的初始化

进栈操作

出栈操作

完整代码

Stack.c

stack.h

Main.c


上节介绍了顺序栈,本节开始讲解链栈!

所谓链栈就是以链表的形式来实现栈的这种结构。

在链表里面我们有个“头指针”的概念,而在栈里面我们有“栈顶指针”的概念。

Top既可以是头指针,也可以是栈顶指针。

每进栈一个元素,top就往上移动一次,每出栈一个元素,top就往下移动一次。所以我们将指针的方向定义为从上往下指,这样可以省去“头指针”和“栈顶指针”这些概念。

那如何来用结构体来表示链栈?同时,每个节点也都需要一个结构体,里面有指针域和数据域。

因此我们需要定义两个结构体

创建一个linkstack的文件夹

定义链栈

我们需要在stack.h中定义两个结构体

链栈的初始化

我们初始化链表的时候是初始化一个头结点,但是链栈我们就没必要头结点。

所以初始化一个空栈的话,直接让top指针等于空就行了

Stack.c

因为我们不用头结点,所以初始化的时候并不需要申请空间

在stack.h里面声明一下这个函数

Main.c

运行结果:

进栈操作

进栈不存在栈满的情况,因为它是链式结构,因此不用判断

Stack.c

在stack.h里面声明一下这个函数

Main.c

运行结果

出栈操作

将栈顶的元素所在的空间释放掉,但是在释放之前需要把改节点的数据记录下来

Stack.c

在stack.h里面声明一下这个函数

Main.c

运行结果

栈的清空操作和链表的清空操作一模一样,挨个释放,直到top等于空,代码省略。

栈不存在销毁操作,因为我们初始化栈的时候根本不需要申请空间。

完整代码

Stack.c

#include "stack.h"
#include <stdlib.h>

//初始化栈
int InitStack(LinkStack *s)
{
	if(NULL==s)
		return FAILURE;

	s->top=NULL;
	s->length=0;

	return SUCCESS;
}

//进栈操作
int PushStack(LinkStack *s,int num)
{
	if(NULL==s)
		return FAILURE;

	//进栈要给节点申请空间
	Node *m=(Node*)malloc(sizeof(Node)*1);
	if(NULL==m)
		return FAILURE;//申请失败

	//往节点的指针域和数据域填写东西
	m->data=num;
	m->next=s->top;//此时这个节点是栈顶,所以它指向的是top指向的位置
	//更新top的值
	s->top=m;//指向这个节点
	//长度加1
	s->length++;

	return SUCCESS;
}

//出栈操作
int PopStack(LinkStack *s)
{
	if(NULL==s)
		return FAILURE;

	//将要释放的节点的值记录下来,等会儿要返回
	int num=s->top->data;//栈顶指针s->top指向一个节点,这个节点里面有个数据data,其实s->top就是一个地址,通过地址访问该地址里面的成员data
	//将要释放的节点的地址也记录下来,等会儿要释放掉这个空间
	Node *n=s->top;
	//s->top向下移动
	s->top=n->next;
	
	free(n);//释放掉记录下来的地址

	return num;
}

stack.h

#ifndef _STACK_H
#define _STACK_H

#define SUCCESS 1000
#define FAILURE 1001

//表示节点的结构体
typedef struct Node
{
	int data;//数据域
	struct Node *next;//指针域
}Node;

//表示栈的结构体
typedef struct Stack
{
	Node *top;//表示栈顶指针
	int length;//表示栈的长度
}LinkStack;


int InitStack(LinkStack *s);
int PushStack(LinkStack *s,int num);
int PopStack(LinkStack *s);


#endif

Main.c

#include <stdio.h>
#include "stack.h"

int main()
{
	//创建栈
	LinkStack Stack;

	//初始化链栈
	int ret=InitStack(&Stack);
	if(SUCCESS==ret)
	{
		printf("初始化栈成功\n");
	}
	else
	{
		printf("初始化栈失败\n");
	}

	//进栈操作
	ret=PushStack(&Stack,10);//进栈10
	if(SUCCESS==ret)
	{
		printf("进栈成功\n");
	}
	else
	{
		printf("进栈失败\n");
	}

	//出栈操作
	ret=PopStack(&Stack);
	if(FAILURE==ret)
	{
		printf("出栈失败\n");
	}
	else
	{
		printf("%d 出栈成功\n",ret);
	}

	return 0;
}

下节使用栈结构来解决一道四则运算的问题!

QQ交流群:963138186

本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vera工程师养成记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值