当前位置: 首页 > news >正文

【数据结构】栈(stack)

写在前面

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

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

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

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

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

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

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

  1. 栈的经典力扣题推荐


先识概念

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

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

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


再看思想

顺序存储结构

#define MAXSIZE 100
#define OK 1
#define ERROR 0typedef 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];//栈顶指针-1S->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;//将栈顶结点赋值给pp = *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 0typedef 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;//将栈顶结点赋值给pp = (*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)——中等

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

相关文章:

【数据结构】栈(stack)

写在前面本篇文章开始讲解栈的有关知识&#xff0c;其实把顺序表和链表学好&#xff0c;那么这一章便不在话下&#xff0c;栈实际上就是顺序表或链表的一些特殊情况。用顺序表实现的栈叫做顺序栈用链表实现的栈叫做链栈文章的内容分为几个部分&#xff0c;希望读者能快速了解文…...

初识shell

文章目录一、shell基本知识1.1为什么学习和使用Shell编程1.2 什么是Shell1.2.1 shell的起源1.2.2 shell的功能1.3 shell的分类1.4 作为程序设计的语言——shell1.5 如何学好shell1.6 shell脚本的基本元素1.7 shell脚本编写规范1.8shell脚本的执行方式1.9 执行脚本的方法1.10 sh…...

程序员如何编写好开发技术文档 如何编写优质的API文档工作

编写技术文档&#xff0c;是令众多开发者望而生畏的任务之一。它本身是一件费时费力才能做好的工作。可是大多数时候&#xff0c;人们却总是想抄抄捷径&#xff0c;这样做的结果往往非常令人遗憾的&#xff0c;因为优质的技术文档是决定你的项目是否引人关注的重要因素。无论开…...

二级C语言操作例题(四十)

一、程序填空题 在此程序中&#xff0c;函数fun的功能是&#xff1a;在形参s所指字符串中寻找与参数c相同的字符&#xff0c;并在其后插入一个与之相同的字符&#xff0c;若找不到相同的字符则不做任何处理。 例如&#xff0c;若s所指字符串”baacda”&#xff0c;中c的字符为…...

vue-router 源码解析(二)-创建路由匹配对象

文章目录基本使用导语createRouterMatcher 创建匹配路由记录addRoute 递归添加matchercreateRouteRecordMatcher 创建matchertokenizePath 解析pathtokensToParser 记录打分insertMatcher 将matcher排序总结基本使用 const routes [{path:"/",component: Demo2,nam…...

分布式新闻项目实战 - 10.Long类型精度丢失问题

怒发冲冠&#xff0c;凭阑处、潇潇雨歇。抬望眼&#xff0c;仰天长啸&#xff0c;壮怀激烈。三十功名尘与土&#xff0c;八千里路云和月。莫等闲、白了少年头&#xff0c;空悲切。 靖康耻&#xff0c;犹未雪。臣子恨&#xff0c;何时灭。驾长车&#xff0c;踏破贺兰山缺。壮志饥…...

如何将本地jar包安装到maven仓库

mvn install:install-file:主要是将本地自定义jar安装到maven仓库&#xff0c;然后在pom中可以直接通过dependency的方式来引用。 此命令有如参数&#xff1a; 命令说明-DgroupId自定义groupId设置groupId 名-DartifactId自定义artifactId设置该包artifactId名-Dversion自定义…...

C++:map和set的认识和简单使用/关联式容器

关联式容器 关联式容器即是用来存储数据的&#xff0c;并且存储的是<Key&#xff0c;Value>结构的键值对&#xff0c;在数据检索时效率比序列式容器高。 序列式容器也就是vector、list、queue等容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是…...

网络工程师一定要学会的知识点:OSPF,今天给大家详细介绍

1. OSPF 概念OSPF&#xff08;Open Shortest Path First 开放式最短路径优先&#xff09;是一种动态路由协议&#xff0c;属于内部网关协议(Interior Gateway Protocol,简称 IGP)&#xff0c;是基于链路状态算法的路由协议。2. OSPF 的运行原理&#xff08;1&#xff09;OSPF 的…...

企业管理的三大基石及其关系

企业管理的三大基石三大基石是什么三大基石的关系制度&#xff1a;管理&#xff1a;文化&#xff1a;三大基石是什么 一个企业&#xff0c;不管它是属于哪种类型&#xff0c;影响员工行为的都有三种力量——制度、管理和文化&#xff0c;这是管理的三大基石。 三大基石的关系 …...

6个月软件测试培训出来后的感悟 —— 写给正在迷茫是否要转行或去学软件测试的学弟们

本人刚从某培训机构学习结束&#xff0c;现在已经上班一个月了。这篇文章我不会说太多的知识点&#xff0c;或噱人去培训机构学习的话语&#xff0c;仅作为一个普通打工者的身份&#xff0c;来写给那些对于软件测试未来发展、薪资待遇等不清楚的正在为家庭&#xff0c;解决信用…...

IoU Loss综述(IOU,GIOU,CIOU,EIOU,SIOU,WIOU)

边界框回归&#xff08;BBR&#xff09;的损失函数对于目标检测至关重要。它的良好定义将为模型带来显著的性能改进。大多数现有的工作假设训练数据中的样本是高质量的&#xff0c;并侧重于增强BBR损失的拟合能力。 一、L2-norm 最初的基于回归的BBR损失定义为L2-norm&#xf…...

Node=>Express中间件 学习3

1.概念&#xff1a; 例&#xff1a;在处理污水的时候&#xff0c;一般都要经过三个处理环节&#xff0c;从而保证处理过后的废水&#xff0c;达到排放标准 处理污水的这三个中间处理环节&#xff0c;就可以叫中间件 2.中间件调用流程 当一个请求到达Express的服务器之后&#x…...

【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作的问题)

【STM32笔记】HAL库UART串口配置及重定向&#xff08;解决接收中断与scanf不能同时工作的问题&#xff09; 首先 要使用printf和scanf 必不可少的就是 #include <stdio.h>这里需要做的就是配置单片机的UART 并且使其能够被printf和scanf调用 打开异步工作模式 并且选择…...

【前端CSS面试题】2023前端最新版css模块,高频15问

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;博主收集的CSS面试题 目录 一、CSS必备面试题 1.CSS3新特性 2.CSS实现元素两个盒子垂…...

Linux命令大全,赶紧收藏!

新的一年 新的征程 新的课程开班 等你来学&#xff01; 本文为Linux命令大全&#xff0c;从A到Z都有总结&#xff0c;建议大家收藏以便查用&#xff0c;或者查漏补缺&#xff01; A 命令 描述 access 用于检查调用程序是否可以访问指定的文件&#xff0c;用于检查文件…...

大数据入门怎么学习

大数据学习不能停留在理论的层面上&#xff0c;大数据方向切入应是全方位的&#xff0c;基础语言的学习只是很小的一个方面&#xff0c;编程落实到最后到编程思想。学习前一定要对大数据有一个整体的认识。 大数据是数据量多吗&#xff1f;其实并不是&#xff0c;通过Hadoop其…...

用于异常检测的深度神经网络模型融合

用于异常检测的深度神经网络模型融合 在当今的数字时代&#xff0c;网络安全至关重要&#xff0c;因为全球数十亿台计算机通过网络连接。近年来&#xff0c;网络攻击的数量大幅增加。因此&#xff0c;网络威胁检测旨在通过观察一段时间内的流量数据来检测这些攻击&#xff0c;…...

游戏服务器如何选择合适的服务器配置

游戏服务器如何选择合适的服务器配置 大家好&#xff0c;今天给大家分享一下游戏服务器配置的选择&#xff0c;为什么特别的说明一下服务器呢&#xff1f;服务器是决定服稳定性和安全性最重要的一个程序&#xff0c;如果是服务器配置不够&#xff0c;可能会导致服掉线、卡顿的…...

01-幂等性解释,问题及常用解决方案

目录 1. 幂等性简介 2. 后端如何解决幂等性问题 2.1 数据库层面 -> 2.1.1 防重表 -> 2.1.2 数据库悲观锁(不建议,容易出现死锁情况) -> 2.1.3 数据库乐观锁 -> 2.1.4 乐观锁CAS算法原理 2.2 锁层面 2.3 幂等性token层面 -> 2.3.1 简介文字描述: …...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...