9-数据结构-栈(C语言版)
数据结构-栈(C语言版)
目录
数据结构-栈(C语言版)
1.栈的基础知识
1.入栈,出栈的排列组合
情景二:Catalan函数(计算不同出栈的总数)
2.栈的基本操作
1.顺序存储
(1)顺序栈-定义:
(2)顺序栈-栈空
(3)顺序栈-入栈
(4)顺序栈-出栈以及取值
(5)共享栈
2.链式存储
(1)链栈-定义:
(2)链栈-入栈
(3)链栈-出栈
(4)链栈-打印栈
总代码如下:(可运行)
1.栈的基础知识
简介:
栈是后进先出,逻辑上相当于一个桶,只能从顶端操作。
1.入栈,出栈的排列组合
情景一:已知入栈序列,求出栈序列的可能。
方法:先看出栈序列最左边,之后按个排序,拿着这个出栈的数,取入栈序列找它前面的可能,之后再回到选择取对比。
例如:a,b,c,d,e,f依次进栈,求出栈的可能不是哪个:一般为选择题,从选项中的出栈序列最左边开始找,如fedcba,若f先出栈,则f后面的次序一定是...e..d..c..b..a,发现符合,再看第二个fe,e出栈后,后面出栈的可能为d..c..b..a..f符合,再看第三个fed,d出栈后,可能出栈的有:c..b..a..,符合,直到最后都符合。所以这个出栈对。又例如:出栈序列cabdef,先c,c先出栈,后面可能..b..a,结果选项出栈为..a..b,次序反了,所以这个就不是,
情景二:Catalan函数(计算不同出栈的总数)
n个元素依次进栈,可以得到多少种不同的出栈序列?
Catalan函数公式:,别问为啥,问就是,记着就行了。代入,即可得到结果,
2.栈的基本操作
简介:按照不同存储方式,分为顺序存储和链式存储。
1.顺序存储
简介:顺序存储即定义一个结构体,里面有一个存储数据的数组,和一个记录栈顶的变量top。
如图:
(1)顺序栈-定义:
#define MaxSize 50 //最大容量
typedef struct
{int data[MaxSize];//存储栈数据的一维数组int top; //表示栈顶的变量top
}SqStack;
(2)顺序栈-栈空
简介:要看清楚栈空时,top指向哪里,不同的指向,进栈出栈的操作就不一样,不过,一般画图,就明白了。
初始化:InitStack(&s) 即栈空
//初始化
//因为想要改变结构体内的值,实参形参都变化,所以传栈s的地址进来,栈*S指针接收
void InitStack(SqStack *s)
{s->top=-1;
}
要看清top栈空的条件时什么,再进行相应的初始化。
初始化之后,便是验证是否栈空StackEmpty(s)
//判断是否栈空
void StackEmpty(SqStack s)
{if(s.top== -1)return 1;
}
(1)s.top==-1,表示栈空
此时,我的数组要想赋值,肯定需要top先加1,定位到数组第一个元素,随后再赋值。因此当top==-1表示空时,top先++,随后再赋值,top始终指向栈顶位置
(2)s.top==0,表示栈空
此时,我的数组要想赋值,top已经指向数组第一个位置,可以直接赋值,之后再top++。因此当top==0表示空时,先赋值,再top++,top始终指向栈顶位置的下一个位置
(3)顺序栈-入栈
入栈即从外边,进桶里,此时要考虑上溢情况,避免数组容量不够。上溢可通过一定的策略优化,减少上溢的情况
代码如下:SqPush(&s,x);
//入栈
void SqPush(SqStack *s,int x)
{if(s->top == MaxSize-1){exit(-1);//栈满,退出 }s->top++;s->data[s->top]=x;
}
(4)顺序栈-出栈以及取值
出栈则是从顶部出取,只可操作一端。出栈时考虑下溢,下溢时逻辑错误,不取决于策略的优化
代码如下:
//出栈
void Sqpush(SqStack *s,int *n)
{if(s->top==-1)exit(-1); *n=s->data[s->top];s->top--;
}
(5)共享栈
简介:当顺序栈一次性申请的数组空间太大时,会造成空间浪费,最后还有好多空间没有用。因此对于两个类型相同的栈,我们可以让他们在同一个栈中,进行存取。分别从左右两端进行入栈,中间为栈底。
共享栈的好处:节省存储空间,降低发生上溢的可能
栈空:top0==-1,top1==MaxSize
栈满:他俩碰头了,top0+1=top1
共享栈了解思想即可。
2.链式存储
简介:采取单链表形式实现的栈,为栈的链式存储,只不过这里的单链表,只能从表头进行插入和删除。
采用链栈的优点:便于多个栈共享存储空间,提高效率,不存在上溢情况,插入删除更方便。
特殊约定:采用单链表实现的栈,默认没有头节点,头指针直接指向第一个实际结点,都在表头进行操作。
(1)链栈-定义:
//栈的链式存储
typedef struct StackNode
{int data;struct StackNode *next; }StackNode;
(2)链栈-入栈
思路:插入结点,插入结点先主动,P结点的指针与,存储原第一个结点的地址,即头节点所存的地址。之后更新头指针,把p结点地址赋值给头指针phead
代码如下:
//入栈
StackNode* StackNodepush(StackNode *phead,int x)
{StackNode* p=(StackNode*)malloc(sizeof(StackNode));p->data=x;p->next=NULL;if(phead==NULL){phead=p;}else{p->next=phead;phead=p; }return phead;
}
(3)链栈-出栈
出栈,即用一个变量接收出栈的值,随后再定义一个临时指针,指向需要出的结点,用来最后释放掉,之后移动头指针,更新头指针为第二个结点地址,最后释放掉出栈结点即可。
代码如下:
//出栈
StackNode* StackNodepop(StackNode* phead,int x)
{ //单链表可能为空,所以需要先判断非法情况 if(phead==NULL)return NULL;//取第一结点的值 x=phead->data;//另外赋值第一个结点 ,为了后面找到它并释放 StackNode *p=phead;//直接更新头节点 phead=p->next;free(p);return phead;
}
(4)链栈-打印栈
void StackPrint(StackNode* phead)
{StackNode* pos =phead;while(pos!=NULL){printf("%d->",pos->data);pos = pos->next;}printf("NULL\n");}
总代码如下:(可运行)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//顺序栈
#define MaxSize 50
typedef struct
{int data[MaxSize];int top;
}SqStack;
//初始化
void InitStack(SqStack *s)
{s->top=-1;
}
//判断是否栈空
int StackEmpty(SqStack s)
{if(s.top== -1)return 1;
}
//入栈
void SqPush(SqStack *s,int x)
{if(s->top == MaxSize-1){exit(-1);//栈满,退出 }s->top++;s->data[s->top]=x;
}
//出栈
void Sqpush(SqStack *s,int *n)
{if(s->top==-1)exit(-1); *n=s->data[s->top];s->top--;
}
//栈的链式存储
typedef struct StackNode
{int data;struct StackNode *next; }StackNode;
//入栈
StackNode* StackNodepush(StackNode *phead,int x)
{StackNode* p=(StackNode*)malloc(sizeof(StackNode));p->data=x;p->next=NULL;if(phead==NULL){phead=p;}else{p->next=phead;phead=p; }return phead;
}
//出栈
StackNode* StackNodepop(StackNode* phead,int x)
{ //单链表可能为空,所以需要先判断非法情况 if(phead==NULL)return NULL;//取第一结点的值 x=phead->data;//另外赋值第一个结点 ,为了后面找到它并释放 StackNode *p=phead;//直接更新头节点 phead=p->next;free(p);return phead;
}
void StackPrint(StackNode* phead)
{StackNode* pos =phead;while(pos!=NULL){printf("%d->",pos->data);pos = pos->next;}printf("NULL\n");}
int main()
{StackNode *phead;phead=StackNodepush(phead,0);phead=StackNodepush(phead,1);phead=StackNodepush(phead,2);phead=StackNodepush(phead,3);StackPrint(phead);return 0;
}
相关文章:
![](https://img-blog.csdnimg.cn/b5602683ba934aca87d769fee67bcfb7.png)
9-数据结构-栈(C语言版)
数据结构-栈(C语言版) 目录 数据结构-栈(C语言版) 1.栈的基础知识 1.入栈,出栈的排列组合 情景二:Catalan函数(计算不同出栈的总数) 2.栈的基本操作 1.顺序存储 (1)顺序栈-定义…...
![](https://img-blog.csdnimg.cn/b9f2aee6895b48e5aad9e39dbe0b9e69.png)
C#,数值计算——用于从连续的数据值流估计任意分位数的计算方法与源程序
1 分位数Quantile 分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。 2 常见各类分位数 2.1 二分位…...
![](https://wiki.finogeeks.club/download/attachments/227952637/image-2023-8-1_10-53-30.png?version=1&modificationDate=1690858413359&api=v2)
实践分享:小程序事件系统设计
微信小程序官方文档中解释说:事件是用于子组件向父组件传递数据,可以传递任意数据。 小程序开发中的事件是指视图层到逻辑层的通讯方式,主要是可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上,当达到触发事件&#…...
![](https://www.learnfk.com/guide/images/wuya.png)
无涯教程-Perl - bless函数
描述 此函数告诉REF引用的实体,它现在是CLASSNAME包中的对象,如果省略CLASSNAME,则为当前包中的对象。建议使用bless的两个参数形式。 语法 以下是此函数的简单语法- bless REF, CLASSNAMEbless REF返回值 该函数返回对祝福到CLASSNAME中的对象的引用。 例 以下是显示其…...
![](https://www.ngui.cc/images/no-images.jpg)
Java关键字:final解析
目录 一、final变量 二、final方法 三、final类 final是Java语言中的一个关键字,凡是被final关键字修饰过的内容都是不可改变的。 一、final变量 final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常࿰…...
![](https://img-blog.csdnimg.cn/08e5d41446f843e780d65131d5146327.png)
LeetCode--HOT100题(25)
目录 题目描述:141. 环形链表(简单)题目接口解题思路代码 PS: 题目描述:141. 环形链表(简单) 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连…...
![](https://www.ngui.cc/images/no-images.jpg)
外卖项目,登录设计,nginx反向代理,MD5明文加密
.gitignore文件里的东西是进行排除,不用git进行管理。登录设计, controller 接收并封装参数调用service方法查询数据库封装结果并响应 登录成功后,生成jwt令牌 Service层 调用mapper查询数据库密码比对返回结果Mapper 编写sql语句为什么前端不…...
![](https://img-blog.csdnimg.cn/ab67767e520044a1b6525ff3951da2e4.png)
【云原生】kubernetes在Pod中init容器的作用和使用
目录 Pod 中 init 容器 1 init 容器特点 2 使用 init 容器 Pod 中 init 容器 Init 容器是一种特殊容器,在Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 1 init 容器特点 init 容器与普通的容器非常像…...
![](https://www.ngui.cc/images/no-images.jpg)
springboot+vue分页
java项目 导包 <!--springboot整合pagehelper--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.1</version></dependency>前端 vue项目…...
![](https://img-blog.csdnimg.cn/1475dff22b664b348e45d16535e72c1b.png)
【linux】ssh 和adb connect区别
问:ssh 与ping的区别 答:SSH(Secure Shell)和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议,用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式,可以在不安全的网络上进行远程登…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.5/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N6B9)
iPhone手机怎么恢复出厂设置(详解)
如果您的iPhone遇到了手机卡顿、软件崩溃、内存不足或者忘记手机解锁密码等问题,恢复出厂设置似乎是万能的解决方法。 什么是恢复出厂设置?简单来说,就是让手机重新变成一张白纸,将手机所有数据都进行格式化,只保留原…...
![](https://img-blog.csdnimg.cn/img_convert/69d0ed35c8b674382fd57c78e39b89cb.png)
灵活利用ChatAI,减轻工作任务—语言/翻译篇
前言 ChatAI在语言和翻译方面具有重要作用。它能够帮助用户进行多语言交流、纠正错误、学习新语言、了解不同文化背景,并提供文本翻译与校对等功能。通过与ChatAI互动,我们能够更好地利用技术来拓展自己在语言领域的能力和知识,实现更加无障…...
![](https://img-blog.csdnimg.cn/c807d2eb64e244b29b1c43583a683d11.png)
【肌电图信号分析】通道肌电图并查找收缩周期的数量、振幅、最大值和持续时间(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
![](https://www.ngui.cc/images/no-images.jpg)
python 定时器,如何进行周期性的函数运行、状态检查,百分比计算?
文章大纲 schedulescheschedule线程实现1实现2实现3协程(coroutine)参考文献schedule https://stackoverflow.com/questions/373335/how-do-i-get-a-cron-like-scheduler-in-python https://docs.python.org/3/library/sched.html sche schedule import schedule import ti…...
![](https://www.learnfk.com/guide/images/wuya.png)
无涯教程-Perl - fcntl函数
描述 该函数是系统fcntl()函数的Perl版本。使用FILEHANDLE上的SCALAR执行FUNCTION指定的功能。 SCALAR包含函数要使用的值,或者是任何返回信息的位置。 语法 以下是此函数的简单语法- fcntl FILEHANDLE, FUNCTION, SCALAR返回值 该函数返回0,但如果fcntl()的返回值为0,则返…...
![](https://www.ngui.cc/images/no-images.jpg)
docker 命令解析
docker命令解析的文章参考 build 和 commit build适合从头创建一个清晰干净的镜像。 build是从Dockfile产生新的镜像,对于使用者能清晰的知道镜像中包含了哪些内容。commit适合将已有的容器打包提供给其他使用者。 commit是从已经存在的容器产生镜像,这…...
![](https://www.ngui.cc/images/no-images.jpg)
Map集合 实体类对象的相互转换
一、Map转实体类 1. fastjson工具类 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version> </dependency>代码实现 Map<String, Object> authorMap n…...
![](https://img-blog.csdnimg.cn/aa52897d66fe4960835dce9be14ff551.png)
用chatGPT从左右眼图片生成点云数据
左右眼图片 需求 需要将左右眼图像利用视差生成三维点云数据 先问问chatGPT相关知识 进一步问有没有现成的软件 chatGPT提到了OpenCV,我们让chatGPT用OpenCV写一个程序来做这个事情 当然,代码里面会有一些错误,chatGPT写的代码并不会做模…...
![](https://img-blog.csdnimg.cn/e30c4d35b9bd4ffbab42908b76bf56be.jpeg)
dy六神参数记录分析(立秋篇)
version: 23.9 X-SSSTUB: 搜索:x-tt-dt var hashMap Java.use("java.util.HashMap");hashMap.put.implementation function (a, b) {console.log("hashMap.put: ", a, b);return this.put(a, b);}https://codeooo.blog.csdn.n…...
![](https://img-blog.csdnimg.cn/39f8ea2a1c1b481099fc842f530e8045.png)
微信-jssdk使用
需求: h5中使用微信的jsSDK,后续实现微信定位以及多图上传 微信文档 申请测试公众号 1.测试公众号进行配置 其中的域名是本地的ip地址 config接口进行权限配置,动态获取JS-SDK权限验证的签名 获取公众号accessToken以及jsTicket public static String WeChatAppId="wx…...
![](https://www.ngui.cc/images/no-images.jpg)
guava-retry使用笔记
guava-retry使用笔记 xml依赖 <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>2.0.0</version> </dependency>使用案例 重试3次,每次间隔3秒 /*** 重试…...
![](https://www.ngui.cc/images/no-images.jpg)
P1226 【模板】快速幂 | 取余运算
【模板】快速幂 | 取余运算 题目描述 给你三个整数 a , b , p a,b,p a,b,p,求 a b m o d p a^b \bmod p abmodp。 输入格式 输入只有一行三个整数,分别代表 a , b , p a,b,p a,b,p。 输出格式 输出一行一个字符串 a^b mod ps,其中 …...
![](https://img-blog.csdnimg.cn/07d7899878c44cd793f77c6a2a7432f3.png)
常用开源的弱口令检查审计工具
常用开源的弱口令检查审计工具 1、SNETCracker 1.1、超级弱口令检查工具 SNETCracker超级弱口令检查工具是一款开源的Windows平台的弱口令安全审计工具,支持批量多线程检查,可快速发现弱密码、弱口令账号,密码支持和用户名结合进行检查&am…...
![](https://www.ngui.cc/images/no-images.jpg)
云监控插件cloudmonitor安装保姆级教程
1、 需要isv把这些域名和ip加入到hosts中; 192.168.31.61 update.aegis.cloud.jiashan.gov.cn; 192.168.31.61 update.aegis.aliyun.com; 192.168.31.61 update2.aegis.cloud.jiashan.gov.cn; 192.168.31.61 update2.aegis.aliyun…...
![](https://www.ngui.cc/images/no-images.jpg)
借用和引用
文章目录 所有权引用和借用可变引用悬垂引用 所有权 Rust通过所有权来管理内存,最妙的是,这种检查只发生在编译期,因此对于程序运行期,不会有任何性能上的损失。 使用堆和栈的性能区别: 写入方面:入栈比在…...
![](https://img-blog.csdnimg.cn/0519593b493a45da96a54d47c6b8cf0a.png)
WPF上位机9——Lambda和Linq
Lambda Linq 操作集合 使用类sql形式查询 Linq To SQL...
![](https://img-blog.csdnimg.cn/37c61fd868c6431a8ddecb48a0172519.png)
从0到1搭建uniapp
一、什么是uniapp UniApp是一款基于Vue.js框架的全端开发工具,可以实现同时开发多个平台(包括H5、小程序、APP等)应用的能力。使用UniApp,开发者只需要编写一份代码就可以快速地发布到多个平台,极大地提高了开发效率和…...
![](https://img-blog.csdnimg.cn/c62046e421aa48d3977429d9daa7cd3e.png)
安全杂记 - Linux文本三剑客之awk
目录 1.什么是AWK2.正则表达式3.语法4.内置变量示例printf命令5.复现awk经典实例(1).插入几个新字段(2).格式化空白(3).筛选IPv4地址(4).筛选给定时间范围内的日志 1.什么是AWK awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。三者的功能都是处理文本&a…...
![](https://img-blog.csdnimg.cn/76dd20d3805e4357aff65e8ceef64556.png)
Android 开发者选项日志存储路径
android开发者选项中存在两个item是关于系统日志的。 1.日志记录器缓冲区大小 2.在设备上永久存储日志记录器数据 一个是用来设置缓冲区大小,一个是用来日志存储开关及过滤。 通过分析 system/core/logcat/logcatd.rc mkdir /data/misc/logd 0770 logd log 日志的…...
![](https://img-blog.csdnimg.cn/4aebce3c4bb34cb7bd4a3ae5e807b41a.png)
jupyter lab build失败,提示需要安装版本>=12.0.0的nodejs但其实已从官网安装18.17.0版本 的解决方法
出现的问题如题目所示,这个问题差点要把我搞死了。。。但还是在没有重装的情况下解决了😘。 问题来源 初衷是想安装lsp扩展,直接在jupyter lab网页界面的extensions中搜索lsp并点击install krassowski/jupyterlab-lsp,会提示需要…...
![](https://img-blog.csdnimg.cn/img_convert/a5c9404e60aeb493ef9f0aebd6d18bd5.png)
西安手机网站定制网站建设/郴州网络推广公司排名
一、准备工作微信公众平台:https://mp.weixin.qq.com/申请测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index微信推送消息模板不需要发布服务器,也不需要填写授权回调域名,只需要…...
![](/images/no-images.jpg)
网站建设和管理自查报告/免费域名申请网站
一、输入流与输出流 输入流将数据从文件、标准输入或其他外部输入设备中加载到内存。输出流的作用则刚好相反,即将在内存中的数据保存到文件中,或传输给输出设备。输入流在Java语言中对应于抽象类java.io.InputStream及其子类,输出流对应于抽…...
![](/images/no-images.jpg)
哪些网站怎么进/谷歌广告优化师
1. 解决ScrollView 和viewPager滑动冲突的问题需要重写ScrollView ,使得viewpager获取到横向滑动事件代码如下public class PagerScrollView extends ScrollView { private GestureDetector mGestureDetector; public PagerScrollView(Context context, AttributeSet attrs, …...
![](/images/no-images.jpg)
网站建设后怎么/注册网址
1.HashSet存储字符串并遍历 * 特点:无序、无索引、无重复 HashSet存储字符串并遍历HashSet<String> hs new HashSet<>();hs.add("a");hs.add("b");hs.add("a");hs.add("c");hs.add("c");hs.add(&qu…...
![](/images/no-images.jpg)
服装网站建设平台分析/关键词网站推广
%%主程序theta0pi/10; %%初始角度,可以设置不同的值m1;k80;g9.8;l01; %%l0为弹簧原来长度ll0m*g/k; %%l为弹簧静止时长度[t,u1]ode45(thbfun,[0:0.005:15],[l0 0 theta0 0],[ ],l,k,m,g);[y1,x1]pol2cart(u1(:,3),u1(:,1));y1-y1;figureymaxmax(abs(y1));axis…...
![](https://img-blog.csdnimg.cn/c6403051f3a840c08f1135fe3b265667.png)
东营网站备案代理公司/北京高端网站建设
文章目录rabbitmq 从入门到精通消息队列介绍1.1 介绍1.2 MQ解决什么问题应用解耦流量消峰消息分发异步消息1.3 常见消息队列及比较Rabbitmq安装2.1 服务端原生安装2.2 服务端Docker安装2.3 客户端安装2.4 设置用户和密码基于Queue实现生产者消费者模型基本使用(生产…...