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

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函数公式:\frac{C_{2n}^{n}\textrm{}}{n+1},别问为啥,问就是,记着就行了。代入,即可得到结果,

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;
} 

相关文章:

9-数据结构-栈(C语言版)

数据结构-栈&#xff08;C语言版&#xff09; 目录 数据结构-栈&#xff08;C语言版&#xff09; 1.栈的基础知识 1.入栈&#xff0c;出栈的排列组合 情景二&#xff1a;Catalan函数&#xff08;计算不同出栈的总数&#xff09; 2.栈的基本操作 1.顺序存储 (1)顺序栈-定义…...

C#,数值计算——用于从连续的数据值流估计任意分位数的计算方法与源程序

1 分位数Quantile 分位数&#xff08;Quantile&#xff09;&#xff0c;亦称分位点&#xff0c;是指将一个随机变量的概率分布范围分为几个等份的数值点&#xff0c;常用的有中位数&#xff08;即二分位数&#xff09;、四分位数、百分位数等。 2 常见各类分位数 2.1 二分位…...

实践分享:小程序事件系统设计

微信小程序官方文档中解释说&#xff1a;事件是用于子组件向父组件传递数据&#xff0c;可以传递任意数据。 小程序开发中的事件是指视图层到逻辑层的通讯方式&#xff0c;主要是可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上&#xff0c;当达到触发事件&#…...

无涯教程-Perl - bless函数

描述 此函数告诉REF引用的实体,它现在是CLASSNAME包中的对象,如果省略CLASSNAME,则为当前包中的对象。建议使用bless的两个参数形式。 语法 以下是此函数的简单语法- bless REF, CLASSNAMEbless REF返回值 该函数返回对祝福到CLASSNAME中的对象的引用。 例 以下是显示其…...

Java关键字:final解析

目录 一、final变量 二、final方法 三、final类 final是Java语言中的一个关键字&#xff0c;凡是被final关键字修饰过的内容都是不可改变的。 一、final变量 final关键字可用于变量声明&#xff0c;一旦该变量被设定&#xff0c;就不可以再改变该变量的值。通常&#xff0…...

LeetCode--HOT100题(25)

目录 题目描述&#xff1a;141. 环形链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;141. 环形链表&#xff08;简单&#xff09; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连…...

外卖项目,登录设计,nginx反向代理,MD5明文加密

.gitignore文件里的东西是进行排除&#xff0c;不用git进行管理。登录设计&#xff0c; controller 接收并封装参数调用service方法查询数据库封装结果并响应 登录成功后&#xff0c;生成jwt令牌 Service层 调用mapper查询数据库密码比对返回结果Mapper 编写sql语句为什么前端不…...

【云原生】kubernetes在Pod中init容器的作用和使用

目录 Pod 中 init 容器 1 init 容器特点 2 使用 init 容器 Pod 中 init 容器 Init 容器是一种特殊容器&#xff0c;在Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 1 init 容器特点 init 容器与普通的容器非常像&#xf…...

springboot+vue分页

java项目 导包 <!--springboot整合pagehelper--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.1</version></dependency>前端 vue项目…...

【linux】ssh 和adb connect区别

问&#xff1a;ssh 与ping的区别 答&#xff1a;SSH&#xff08;Secure Shell&#xff09;和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议&#xff0c;用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式&#xff0c;可以在不安全的网络上进行远程登…...

iPhone手机怎么恢复出厂设置(详解)

如果您的iPhone遇到了手机卡顿、软件崩溃、内存不足或者忘记手机解锁密码等问题&#xff0c;恢复出厂设置似乎是万能的解决方法。 什么是恢复出厂设置&#xff1f;简单来说&#xff0c;就是让手机重新变成一张白纸&#xff0c;将手机所有数据都进行格式化&#xff0c;只保留原…...

灵活利用ChatAI,减轻工作任务—语言/翻译篇

前言 ChatAI在语言和翻译方面具有重要作用。它能够帮助用户进行多语言交流、纠正错误、学习新语言、了解不同文化背景&#xff0c;并提供文本翻译与校对等功能。通过与ChatAI互动&#xff0c;我们能够更好地利用技术来拓展自己在语言领域的能力和知识&#xff0c;实现更加无障…...

【肌电图信号分析】通道肌电图并查找收缩周期的数量、振幅、最大值和持续时间(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

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…...

无涯教程-Perl - fcntl函数

描述 该函数是系统fcntl()函数的Perl版本。使用FILEHANDLE上的SCALAR执行FUNCTION指定的功能。 SCALAR包含函数要使用的值,或者是任何返回信息的位置。 语法 以下是此函数的简单语法- fcntl FILEHANDLE, FUNCTION, SCALAR返回值 该函数返回0,但如果fcntl()的返回值为0,则返…...

docker 命令解析

docker命令解析的文章参考 build 和 commit build适合从头创建一个清晰干净的镜像。 build是从Dockfile产生新的镜像&#xff0c;对于使用者能清晰的知道镜像中包含了哪些内容。commit适合将已有的容器打包提供给其他使用者。 commit是从已经存在的容器产生镜像&#xff0c;这…...

Map集合 实体类对象的相互转换

一、Map转实体类 1. fastjson工具类 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version> </dependency>代码实现 Map<String, Object> authorMap n…...

用chatGPT从左右眼图片生成点云数据

左右眼图片 需求 需要将左右眼图像利用视差生成三维点云数据 先问问chatGPT相关知识 进一步问有没有现成的软件 chatGPT提到了OpenCV&#xff0c;我们让chatGPT用OpenCV写一个程序来做这个事情 当然&#xff0c;代码里面会有一些错误&#xff0c;chatGPT写的代码并不会做模…...

dy六神参数记录分析(立秋篇)

version&#xff1a; 23.9 X-SSSTUB: 搜索&#xff1a;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…...

微信-jssdk使用

需求: h5中使用微信的jsSDK,后续实现微信定位以及多图上传 微信文档 申请测试公众号 1.测试公众号进行配置 其中的域名是本地的ip地址 config接口进行权限配置,动态获取JS-SDK权限验证的签名 获取公众号accessToken以及jsTicket public static String WeChatAppId="wx…...

guava-retry使用笔记

guava-retry使用笔记 xml依赖 <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>2.0.0</version> </dependency>使用案例 重试3次&#xff0c;每次间隔3秒 /*** 重试…...

P1226 【模板】快速幂 | 取余运算

【模板】快速幂 | 取余运算 题目描述 给你三个整数 a , b , p a,b,p a,b,p&#xff0c;求 a b m o d p a^b \bmod p abmodp。 输入格式 输入只有一行三个整数&#xff0c;分别代表 a , b , p a,b,p a,b,p。 输出格式 输出一行一个字符串 a^b mod ps&#xff0c;其中 …...

常用开源的弱口令检查审计工具

常用开源的弱口令检查审计工具 1、SNETCracker 1.1、超级弱口令检查工具 SNETCracker超级弱口令检查工具是一款开源的Windows平台的弱口令安全审计工具&#xff0c;支持批量多线程检查&#xff0c;可快速发现弱密码、弱口令账号&#xff0c;密码支持和用户名结合进行检查&am…...

云监控插件cloudmonitor安装保姆级教程

1、 需要isv把这些域名和ip加入到hosts中&#xff1b; 192.168.31.61 update.aegis.cloud.jiashan.gov.cn&#xff1b; 192.168.31.61 update.aegis.aliyun.com&#xff1b; 192.168.31.61 update2.aegis.cloud.jiashan.gov.cn&#xff1b; 192.168.31.61 update2.aegis.aliyun…...

借用和引用

文章目录 所有权引用和借用可变引用悬垂引用 所有权 Rust通过所有权来管理内存&#xff0c;最妙的是&#xff0c;这种检查只发生在编译期&#xff0c;因此对于程序运行期&#xff0c;不会有任何性能上的损失。 使用堆和栈的性能区别&#xff1a; 写入方面&#xff1a;入栈比在…...

WPF上位机9——Lambda和Linq

Lambda Linq 操作集合 使用类sql形式查询 Linq To SQL...

从0到1搭建uniapp

一、什么是uniapp UniApp是一款基于Vue.js框架的全端开发工具&#xff0c;可以实现同时开发多个平台&#xff08;包括H5、小程序、APP等&#xff09;应用的能力。使用UniApp&#xff0c;开发者只需要编写一份代码就可以快速地发布到多个平台&#xff0c;极大地提高了开发效率和…...

安全杂记 - Linux文本三剑客之awk

目录 1.什么是AWK2.正则表达式3.语法4.内置变量示例printf命令5.复现awk经典实例(1).插入几个新字段(2).格式化空白(3).筛选IPv4地址(4).筛选给定时间范围内的日志 1.什么是AWK awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客。三者的功能都是处理文本&a…...

Android 开发者选项日志存储路径

android开发者选项中存在两个item是关于系统日志的。 1.日志记录器缓冲区大小 2.在设备上永久存储日志记录器数据 一个是用来设置缓冲区大小&#xff0c;一个是用来日志存储开关及过滤。 通过分析 system/core/logcat/logcatd.rc mkdir /data/misc/logd 0770 logd log 日志的…...

jupyter lab build失败,提示需要安装版本>=12.0.0的nodejs但其实已从官网安装18.17.0版本 的解决方法

出现的问题如题目所示&#xff0c;这个问题差点要把我搞死了。。。但还是在没有重装的情况下解决了&#x1f618;。 问题来源 初衷是想安装lsp扩展&#xff0c;直接在jupyter lab网页界面的extensions中搜索lsp并点击install krassowski/jupyterlab-lsp&#xff0c;会提示需要…...

西安手机网站定制网站建设/郴州网络推广公司排名

一、准备工作微信公众平台&#xff1a;https://mp.weixin.qq.com/申请测试账号&#xff1a;https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index微信推送消息模板不需要发布服务器&#xff0c;也不需要填写授权回调域名&#xff0c;只需要…...

网站建设和管理自查报告/免费域名申请网站

一、输入流与输出流 输入流将数据从文件、标准输入或其他外部输入设备中加载到内存。输出流的作用则刚好相反&#xff0c;即将在内存中的数据保存到文件中&#xff0c;或传输给输出设备。输入流在Java语言中对应于抽象类java.io.InputStream及其子类&#xff0c;输出流对应于抽…...

哪些网站怎么进/谷歌广告优化师

1. 解决ScrollView 和viewPager滑动冲突的问题需要重写ScrollView ,使得viewpager获取到横向滑动事件代码如下public class PagerScrollView extends ScrollView { private GestureDetector mGestureDetector; public PagerScrollView(Context context, AttributeSet attrs, …...

网站建设后怎么/注册网址

1.HashSet存储字符串并遍历 * 特点&#xff1a;无序、无索引、无重复 HashSet存储字符串并遍历HashSet<String> hs new HashSet<>();hs.add("a");hs.add("b");hs.add("a");hs.add("c");hs.add("c");hs.add(&qu…...

服装网站建设平台分析/关键词网站推广

%%主程序theta0pi/10; %%初始角度&#xff0c;可以设置不同的值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…...

东营网站备案代理公司/北京高端网站建设

文章目录rabbitmq 从入门到精通消息队列介绍1.1 介绍1.2 MQ解决什么问题应用解耦流量消峰消息分发异步消息1.3 常见消息队列及比较Rabbitmq安装2.1 服务端原生安装2.2 服务端Docker安装2.3 客户端安装2.4 设置用户和密码基于Queue实现生产者消费者模型基本使用&#xff08;生产…...