图解数据结构--栈的实现-C语言版本--源码

图片可视化 总

在这里插入图片描述

源码

/*
	time 2023年6月12日12:39:06
	auther yzm
	cntent stract  栈
*/


#include<stdio.h>//头文件
#include<malloc.h>//分配地址空间
#include<stdlib.h>//实现exit 终止程序

//定义节点
typedef struct node {
	int Data;
	struct node* pNext;

}NODE, * PNODE;


//栈
typedef struct stract {
	PNODE stractTop;//指向栈顶
	PNODE stractBottom;//指向栈底部
} STRACT, * PSTRACT;

//函数声明
PSTRACT init(PSTRACT pS);
void push(PSTRACT pS, int value);
void transverse(PSTRACT pS);
void pop(PSTRACT pS);
bool empty(PSTRACT pS);


int main() {
	//创建栈顶 栈底
	STRACT  S;

	//1.初始化栈
	PSTRACT pS =init(&S);

	//进栈
	push(pS, 1);
	push(pS, 2);
	push(pS, 3);
	push(pS, 4);
	push(pS, 5);
	push(pS, 6);
	push(pS, 7);
	//遍历输出
	transverse(pS);
	printf("出栈第1次");
	pop(pS);
	transverse(pS);

	printf("进栈第1次");
	push(pS, 74);
	transverse(pS);

	printf("出栈第2次");
	pop(pS);
	transverse(pS);

	printf("出栈第3次");
	pop(pS);
	transverse(pS);

	printf("进栈第2次");
	push(pS, 45);
	transverse(pS);

	printf("进栈第3次");
	push(pS, 54);
	transverse(pS);

	return 0;
}
//初始化栈
PSTRACT init(PSTRACT pS) {
	
	//申请地址
	PNODE phead = (PNODE)malloc(sizeof(NODE));
	phead->pNext = NULL;
	if (phead == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}
	pS->stractTop = phead;
	pS->stractBottom = phead;

	return pS;
}
//进栈
void push(PSTRACT pS,int value) {

	//创建节点
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if (pNew == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}

	//pnew 赋值
	pNew->Data = value;
	//pnew 指向
	pNew->pNext = pS->stractTop;
	//修改pS->stractTop;  栈顶指针
	pS->stractTop = pNew;

}
//遍历
void transverse(PSTRACT pS) {
	//创建 移动遍历的指针  指向栈顶
	PNODE p = pS->stractTop;

	while (p->pNext != NULL)
	{
		printf("%d ", p->Data);
		p = p->pNext;
	}
	printf("\n");

	return;
}

//是否为空
bool empty(PSTRACT pS) {
	if (pS->stractBottom == pS->stractTop)
	{
		return true;
	}
	else {
		return false;
	}
}


//出栈
void pop(PSTRACT pS) {
	//出栈
	//判空操作 
	if (empty(pS))
	{
		printf("空栈 无法出栈");
		return;
	}

	//1.t存放栈顶节点
	PNODE t = pS->stractTop;

	//2.修改栈顶的指针
	pS->stractTop = t->pNext;

	//释放 t
	free(t);


	return;

}


1.头文件介绍—分

#include<stdio.h>//头文件
#include<malloc.h>//分配地址空间
#include<stdlib.h>//实现exit 终止程序

2.节点的实现

//定义节点
typedef struct node {
	int Data;
	struct node* pNext;

}NODE, * PNODE;

以上就是 完成 这样的结构
在这里插入图片描述

3.栈顶栈底

typedef struct stract {
	PNODE stractTop;//指向栈顶
	PNODE stractBottom;//指向栈底部
} STRACT, * PSTRACT;

在这里插入图片描述

4.函数的提前声明

PSTRACT init(PSTRACT pS);
void push(PSTRACT pS, int value);
void transverse(PSTRACT pS);
void pop(PSTRACT pS);
bool empty(PSTRACT pS);

把要实现的函数 提前

5. 栈 —初始化栈

在这里插入图片描述

//初始化栈
PSTRACT init(PSTRACT pS) {
	
	//申请地址
	PNODE phead = (PNODE)malloc(sizeof(NODE));
	phead->pNext = NULL;
	if (phead == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}
	pS->stractTop = phead;
	pS->stractBottom = phead;

	return pS;
}

6. 栈 —进栈

在这里插入图片描述

//进栈
void push(PSTRACT pS,int value) {

	//创建节点
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if (pNew == NULL)
	{
		printf("地址分配失败");
		exit(-1);
	}

	//pnew 赋值
	pNew->Data = value;
	//pnew 指向
	pNew->pNext = pS->stractTop;
	//修改pS->stractTop;  栈顶指针
	pS->stractTop = pNew;

}

7.栈 — 遍历

在这里插入图片描述

//遍历
void transverse(PSTRACT pS) {
	//创建 移动遍历的指针  指向栈顶
	PNODE p = pS->stractTop;

	while (p->pNext != NULL)
	{
		printf("%d ", p->Data);
		p = p->pNext;
	}
	printf("\n");

	return;
}

8.栈 — 是否为空

在这里插入图片描述

//是否为空
bool empty(PSTRACT pS) {
	if (pS->stractBottom == pS->stractTop)
	{
		return true;
	}
	else {
		return false;
	}
}

9.栈 — 出栈

在这里插入图片描述

//出栈
void pop(PSTRACT pS) {
	//出栈
	//判空操作 
	if (empty(pS))
	{
		printf("空栈 无法出栈");
		return;
	}

	//1.t存放栈顶节点
	PNODE t = pS->stractTop;

	//2.修改栈顶的指针
	pS->stractTop = t->pNext;

	//释放 t
	free(t);


	return;

}

10总结

数据结构–栈
就像是一个木桶

每一个节点就是砖头

进栈 就是把砖头放进去

出栈 就是把砖头拿出来

那也就一意味着
最先放进去的砖头 被压着 只能把上面的拿出来 才能那下面的

这也就是 先进后出 后进先出的概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值