【数据结构】栈(stack)

news2025/1/17 6:17:50

写在前面

本篇文章开始讲解栈的有关知识,其实把顺序表和链表学好,那么这一章便不在话下,栈实际上就是顺序表或链表的一些特殊情况。

  • 用顺序表实现的栈叫做顺序栈

  • 用链表实现的栈叫做链栈

文章的内容分为几个部分,希望读者能快速了解文章的脉络架构:

  1. 栈的存储结构——即用结构体定义,包括顺序表栈和链栈

  1. 栈的基本操作——入栈和出栈

  1. 栈的应用——完整的可执行程序(利用前面的基本操作)

  1. 栈的经典力扣题推荐


先识概念

  1. 允许插入和删除的一端叫做栈顶(top),另一端叫做栈底(bottom)

  1. 栈和递归联系紧密,可以用栈来模拟递归的实现过程

  1. 更多知识,还是翻书为妙、


再看思想

顺序存储结构

#define MAXSIZE 100
#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

//顺序栈存储结构
typedef struct
{
	ElemType data[MAXSIZE];
	int top;
}SqStack;

//进栈
Status Push(SqStack* S, ElemType e)
{
	//栈满
	if (S->top == MAXSIZE - 1)
		return ERROR;
	S->top++;
	//将新插入的元素赋值给栈顶
	S->data[S->top] = e;
	return OK;
}
/*
1.函数参数接收,一个结构体类型的指针大S,一个int型变量e
2.首先判断那把移动的标尺top(我们将其下标存入其中)是否等于最大值-1,栈满的情况就不能进栈了
3.再把元素的值存入S的数据域之中
*/

//出栈 
//若栈不空,则删除栈顶元素,用e返回其值
Status Pop(SqStack* S, ElemType* e)
{
	if (S->top == -1)
		return ERROR;
	//将要删除的栈顶元素赋值给e
	*e = S->data[S->top];
	//栈顶指针-1
	S->top--;
	return OK;
}
/*
1.函数参数接收,一个结构体类型的指针变量大S,一个整型指针类型的变量e
2.我们要出栈,自然栈中得有元素,若没有就结束运行,
3.删除栈顶元素之前,把栈顶结点的数据记录下来,让栈顶计数器top减去1
*/

链栈

//链栈
typedef struct LinkNode
{
	ElemType data;
	struct LinkNode* next;
}LinkNode,*LinkStack;

//进栈
Status Push(LinkStack* S, ElemType e)
{
	//创建新结点
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
	p->data= e;

	p->next = *S;
	(*S) = p;
	return OK;
}
/*
1.函数参数接收,链栈指针类型的指针变量大S,整型类型的元素e
2.首先我们创建一个新结点,把它的数据域赋值为e,指针域指向栈顶结点
3.让栈顶指针指向p结点,成为新的栈顶结点
*/

//出栈——若栈不为空,则删除S的栈顶元素,用e返回其值
Status Pop(LinkStack *S, ElemType* e)
{
	LinkNode* p;
	if (S==NULL)
		return ERROR;
	*e = (*S)->data;
	//将栈顶结点赋值给p
	p = *S;
	*S = (*S)->next;
	free(p);
	return OK;
}

/*
1.函数参数接收,链栈类型的指针大S,整型指针e
2.如果是空栈就没有出栈的必要,直接返回0,
3.把结点的数据域赋值给e,用临时指针指向栈顶指针,然后把栈顶指针指向栈顶下面的结点(栈的指针由栈顶指向栈底)
4.之后把临时指针所指向的结点释放即可
*/

再学应用

这是一份可运行的入栈和出栈代码,运用了上面的链栈来实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

//链栈
typedef struct LinkNode
{
	ElemType data;
	struct LinkNode* next;
}LinkNode, *LinkStack;


Status InitStack(LinkStack* S)
{
	*S = NULL;
	return OK;
}
Status Push(LinkStack* S, ElemType e)
{
	//创建新结点
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
	p->data = e;

	p->next = *S;
	*S = p;
	return OK;
}

Status Pop(LinkStack* S, ElemType* e)
{
	LinkNode* p;
	if (*S == NULL)
		return ERROR;
	*e = (*S)->data;
	//将栈顶结点赋值给p
	p = (*S);
	*S = (*S)->next;
	free(p);
	return OK;
}

int main()
{
	int i = 0;
	//初始化链栈
	LinkStack S;
	ElemType e;

	InitStack(&S);
	//进栈
	printf("请输入5个整数入栈:");
	for (i = 0; i < 5; i++)
	{
		scanf("%d", &e);
		Push(&S, e);
	}

	//出栈
	printf("依次出栈为:");
	for (i = 0; i < 5; i++)
	{
		Pop(&S, &e);
		printf("%d ", e);
	}

	return 0;
}

写在最后

学完顺序表和链表之后,栈就很简单了,把上面的基础搞懂之后,下一篇文章我们学习后缀表达式以及中缀表达式转后缀表达式和经典栈题目的解答;

232. 用栈实现队列 - 力扣(LeetCode)——简单——放到队列讲完再解答

20. 有效的括号 - 力扣(LeetCode) ——简单

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)——简单

150. 逆波兰表达式求值 - 力扣(LeetCode)——中等

👍🏻 点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/335349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经过去年的一遍技术洗礼,《最新的Android 核心知识点》出炉了~

金三银四即将来临&#xff0c;相信很多人的心已经在开始蠢蠢欲动准备新年过后跳槽换一个好点的坑位了&#xff0c;披荆斩棘&#xff0c;斩关过将“杀掉”一众竞争对手 &#xff0c;最后成功靠着跳槽涨薪走上人生巅峰&#xff01; 理想很丰满现实慌得一批&#xff0c;大批大批的…

Docker进阶 - 6. docker network 网络模式之bridge

1. bridge概述 Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口)&#xff0c;该桥接网络的名称为docker0&#xff0c;它在内核层连通了其他的物理或虚拟网卡&#xff0c;这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了docker0接口的…

ucore的字符输出

ucore的字符输出有cga,lpt,和串口。qemu模拟出来显示器连接到cga中。 cga cga的介绍网站&#xff1a;https://en.wikipedia.org/wiki/Color_Graphics_Adapter cga是显示卡&#xff0c;内部有个叫6845的芯片。cga卡把屏幕划分成一个一个单元格&#xff0c;每个单元格显示一个a…

“数字孪生”:为什么要仿真嵌入式系统?

​01.仿真是什么&#xff1f; 仿真的概念非常广泛&#xff0c;但归根结底都是使用可控的手段来模仿真实的情况&#xff0c;通常应用于现实世界中实施难度大甚至是无法实践的事物。 众所周知&#xff0c;嵌入式系统通常是形式多样的、面向特定应用的软硬件综合体&#xff0c;无…

Web 框架 Flask 快速入门(一)flask基础与模板

前言 课程地址&#xff1a;Python Web 框架 Flask 快速入门 文章目录前言&#x1f334; Flask基础和模板&#x1f337; 一个简单的flask程序&#x1f33c; 模板的使用&#x1f334; Flask基础和模板 1、web框架的作用 避免重复造轮子&#xff0c;app程序不必关心于服务器的沟…

java agent设计开发概要

agent开发设计 agent 开发的一些心得&#xff0c;适合熟悉agent或者有agent开发需求的同学 1 有个基础的agent&#xff0c;是java 标准的agent。这是agent代码入口 2 设计包结构&#xff0c; 基础agent agent下有plugin,加载plugin可以自己定义一个类加载器 plugin&#xff1…

C++——多态 上

目录 一、概念 二、多态的定义及实现 三、动态多态的实现条件 四、重写相关 五、构成重写与同名隐藏的函数有什么区别&#xff1f; 六、C11 中的override 和 final 一、概念 通俗来说&#xff0c;就是多种形态&#xff0c;当完成某个行为时&#xff0c;当不同的对象去完…

Python 手写数字识别 MNIST数据集下载失败

目录 一、MNIST数据集下载失败 1 失败的解决办法&#xff08;经验教训&#xff09;&#xff1a; 2 亲测有效的解决方法&#xff1a; 一、MNIST数据集下载失败 场景复现&#xff1a;想要pytorchMINIST数据集来实现手写数字识别&#xff0c;首先就是进行MNIST数据集的下载&am…

Fastjson踩“坑”记录和“深度”学习

作者&#xff1a;陶征策 阿里国际站商家技术团队 Fastjson是阿里开发的Java语言编写的高性能JSON库&#xff0c;本文总结了Fastjson使用时的一些注意事项&#xff0c;并简单分析了Fastjson的底层工作原理&#xff0c;结合具体的验证代码以及跟Jackson的对比&#xff0c;希望能…

非代码的贡献也能成为Committer,我与DolphinScheduler社区的故事

点亮 ⭐️ Star 照亮开源之路 https://github.com/apache/dolphinscheduler ​ // 每个人对于”开源社区“的定义都不一样&#xff0c;在社区的想法也完全不一样&#xff0c;我认为玩开源就像”谈恋爱“&#xff0c;要想方设法对它好&#xff0c;在接触 Apache DolphinSche…

nodejs+vue毕业生求职招聘平台系统

前台首页功能模块毕业生信息招聘平台首页、空中宣讲会、招聘岗位、求职信息、论坛信息、试卷列表、招聘资讯、个人中心、后台管理功能。论坛中心试卷列表招聘资讯管理员功能模块管理员登录空中宣讲会管理招聘岗位管理毕业生管理企业功能模块招聘岗位管理信息咨询管理线上面试管…

java实现二叉树(一文带你详细了解二叉树的)

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《数据结构》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我唯一…

JDBC与Druid连接池

1 什么是jdbc? JDBC&#xff08;java database connectivity &#xff09;是Java语言连接操作关系型数据库的一套解决方案&#xff0c;屏蔽了底层各数据库不同的差异。 具体是通过sun公司定义的统一的一套API【标准接口】来实现解决差异&#xff0c; 具体实现是各大数据库厂商…

【数据库】 mysql的四种安装方式

目录 MySQL 安装部署 一&#xff0c;仓库安装 二&#xff0c;本地安装 三&#xff0c;容器安装 四&#xff0c;源码安装 MySQL 安装部署 一&#xff0c;仓库安装 1&#xff0c;使用rpm命令从指定的网址装包 ​ [rootlocalhost yum.repos.d]# rpm -ivh https://repo.mys…

每日学术速递2.10

Subjects: cs.Cv 1.Spatiotemporal Deformation Perception for Fisheye Video Rectification 标题&#xff1a;鱼眼视频矫正的时空形变感知 作者&#xff1a;Shangrong Yang, Chunyu Lin, Kang Liao, Yao Zhao 文章链接&#xff1a;https://arxiv.org/abs/2302.03934v1 项…

【手写 Vuex 源码】第四篇 - Vuex 中 Getters 的实现

一&#xff0c;前言 上篇&#xff0c;主要介绍了 Vuex 中 State 状态的实现&#xff0c;主要涉及以下几个点&#xff1a; 创建 Store 类中的 State 状态&#xff1b;借助 Vue 实现 State 状态的响应式&#xff1b; 本篇&#xff0c;继续介绍 Vuex 中 getters 的实现&#xf…

VHDL语言基础-时序逻辑电路-寄存器

目录 寄存器的设计&#xff1a; 多位寄存器&#xff1a; 多位寄存器的VHDL描述: 移位寄存器&#xff1a; 串进并出的移位寄存器的VHDL描述: 寄存器的设计&#xff1a; 多位寄存器&#xff1a; 一个D触发器就是一位寄存器&#xff0c;如果需要多位寄存器&…

飞凌嵌入式RK3568J核心板助力工业机器人产业迈向高质量发展新阶段

工业机器人是能够代替人工完成高强度重复工作的多自由度机器装置&#xff0c;不仅可以确保产品质量&#xff0c;还可以大幅提高生产效率。据工信部数据显示&#xff0c;“十三五”期间我国工业机器人产量从7.2万套增长到了21.2万套&#xff0c;年均增长31%&#xff0c;预计2023…

切换分支报错:Untracked Files Prevent Checkout

切换分支报错&#xff1a;Untracked Files Prevent Checkoutgit分支切换 Untracked Files Prevent Checkout本人解决办法&#xff1a;git分支切换 Untracked Files Prevent Checkout 新起的项目在切换master分支到工作分支时&#xff0c;出现下图的问题&#xff1a; Untracked…

【机器学习】过拟合与正则化

上一章——逻辑回归 文章目录三种拟合状态解决过拟合的三种方法什么是正则化正则化的数学原理线性回归恭喜三种拟合状态 在之前的课程中&#xff0c;我们说过机器学习的中极为重要的一步&#xff0c;就是给训练集找到一条合适的拟合曲线。 还是以房价问题这个回归问题为例&…