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;
}
相关文章:
9-数据结构-栈(C语言版)
数据结构-栈(C语言版) 目录 数据结构-栈(C语言版) 1.栈的基础知识 1.入栈,出栈的排列组合 情景二:Catalan函数(计算不同出栈的总数) 2.栈的基本操作 1.顺序存储 (1)顺序栈-定义…...
C#,数值计算——用于从连续的数据值流估计任意分位数的计算方法与源程序
1 分位数Quantile 分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。 2 常见各类分位数 2.1 二分位…...
实践分享:小程序事件系统设计
微信小程序官方文档中解释说:事件是用于子组件向父组件传递数据,可以传递任意数据。 小程序开发中的事件是指视图层到逻辑层的通讯方式,主要是可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上,当达到触发事件&#…...
无涯教程-Perl - bless函数
描述 此函数告诉REF引用的实体,它现在是CLASSNAME包中的对象,如果省略CLASSNAME,则为当前包中的对象。建议使用bless的两个参数形式。 语法 以下是此函数的简单语法- bless REF, CLASSNAMEbless REF返回值 该函数返回对祝福到CLASSNAME中的对象的引用。 例 以下是显示其…...
Java关键字:final解析
目录 一、final变量 二、final方法 三、final类 final是Java语言中的一个关键字,凡是被final关键字修饰过的内容都是不可改变的。 一、final变量 final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。通常࿰…...
LeetCode--HOT100题(25)
目录 题目描述:141. 环形链表(简单)题目接口解题思路代码 PS: 题目描述:141. 环形链表(简单) 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连…...
外卖项目,登录设计,nginx反向代理,MD5明文加密
.gitignore文件里的东西是进行排除,不用git进行管理。登录设计, controller 接收并封装参数调用service方法查询数据库封装结果并响应 登录成功后,生成jwt令牌 Service层 调用mapper查询数据库密码比对返回结果Mapper 编写sql语句为什么前端不…...
【云原生】kubernetes在Pod中init容器的作用和使用
目录 Pod 中 init 容器 1 init 容器特点 2 使用 init 容器 Pod 中 init 容器 Init 容器是一种特殊容器,在Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。 1 init 容器特点 init 容器与普通的容器非常像…...
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区别
问:ssh 与ping的区别 答:SSH(Secure Shell)和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议,用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式,可以在不安全的网络上进行远程登…...
iPhone手机怎么恢复出厂设置(详解)
如果您的iPhone遇到了手机卡顿、软件崩溃、内存不足或者忘记手机解锁密码等问题,恢复出厂设置似乎是万能的解决方法。 什么是恢复出厂设置?简单来说,就是让手机重新变成一张白纸,将手机所有数据都进行格式化,只保留原…...
灵活利用ChatAI,减轻工作任务—语言/翻译篇
前言 ChatAI在语言和翻译方面具有重要作用。它能够帮助用户进行多语言交流、纠正错误、学习新语言、了解不同文化背景,并提供文本翻译与校对等功能。通过与ChatAI互动,我们能够更好地利用技术来拓展自己在语言领域的能力和知识,实现更加无障…...
【肌电图信号分析】通道肌电图并查找收缩周期的数量、振幅、最大值和持续时间(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&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产生新的镜像,对于使用者能清晰的知道镜像中包含了哪些内容。commit适合将已有的容器打包提供给其他使用者。 commit是从已经存在的容器产生镜像,这…...
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,我们让chatGPT用OpenCV写一个程序来做这个事情 当然,代码里面会有一些错误,chatGPT写的代码并不会做模…...
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…...
微信-jssdk使用
需求: h5中使用微信的jsSDK,后续实现微信定位以及多图上传 微信文档 申请测试公众号 1.测试公众号进行配置 其中的域名是本地的ip地址 config接口进行权限配置,动态获取JS-SDK权限验证的签名 获取公众号accessToken以及jsTicket public static String WeChatAppId="wx…...
安装paperclip
介绍: # aperclip - 一人工公司的开源编排工具 ## 项目概述 Paperclip 是一个基于 Node.js 的服务器和 React UI,用于编排 AI 代理团队来运营业务。它允许用户导入自定义代理、分配目标,并通过一个仪表板跟踪代理的工作和成本。 核心价值主…...
用Python和Keras从零搭建一个BiLSTM入侵检测模型(基于NSL-KDD数据集)
用Python和Keras从零搭建BiLSTM入侵检测模型实战指南 在网络安全领域,入侵检测系统(IDS)正经历着从传统规则匹配到智能分析的范式转变。本文将带您使用Python生态中的Keras框架,基于经典的NSL-KDD数据集,构建一个具备实战价值的双向长短期记…...
惊艳音效生成效果:HunyuanVideo-Foley实际作品展示与测评
惊艳音效生成效果:HunyuanVideo-Foley实际作品展示与测评 你肯定有过这样的经历:精心拍摄了一段视频,画面构图、光影、运镜都堪称完美,但导出后总觉得少了点什么。对,就是声音。画面里的人物在奔跑,却听不…...
小白也能懂!Meta-Llama-3-8B-Instruct快速上手全攻略
小白也能懂!Meta-Llama-3-8B-Instruct快速上手全攻略 1. 为什么选择Meta-Llama-3-8B-Instruct Meta-Llama-3-8B-Instruct是Meta公司2024年4月开源的中等规模语言模型,特别适合想要体验高质量AI对话但硬件配置有限的开发者。这个80亿参数的模型在单张RT…...
OpenClaw配置备份指南:gemma-3-12b-it模型迁移与快速恢复
OpenClaw配置备份指南:gemma-3-12b-it模型迁移与快速恢复 1. 为什么需要备份OpenClaw配置? 上周我的主力开发机突然硬盘故障,导致精心调校的OpenClaw配置全部丢失。整整两天时间,我都在重新配置模型参数、飞书通道和自定义技能—…...
OpenClaw技能市场盘点:Qwen3-4B模型支持的十大实用自动化模块
OpenClaw技能市场盘点:Qwen3-4B模型支持的十大实用自动化模块 1. 为什么需要关注OpenClaw技能市场? 去年冬天,当我第一次在个人笔记本上部署OpenClaw时,最让我惊喜的不是框架本身的基础能力,而是它背后那个充满可能性…...
告别纯手工!用X-AnyLabeling的SAM2模型,5分钟搞定复杂目标分割标注
5分钟解锁X-AnyLabeling的SAM2黑科技:复杂目标分割标注效率提升指南 当面对医学影像中不规则肿瘤轮廓、遥感图像中的破碎地块边界,或是工业质检场景下的缺陷区域时,传统矩形框标注就像用粉笔画框测量云朵形状——既笨拙又低效。X-AnyLabelin…...
避坑指南:Qt菜单栏triggered信号连接的5个常见错误及解决方法
Qt菜单栏triggered信号连接的5个实战避坑指南 在Qt开发中,菜单栏作为用户交互的重要组件,其点击事件处理看似简单却暗藏玄机。许多开发者都曾掉进过信号槽连接失效、内存泄漏或窗口阻塞的陷阱里。今天我们就来剖析这些高频问题背后的原因,并提…...
【数据结构与算法】第27篇:二叉排序树(BST
一、二叉排序树的定义1.1 性质二叉排序树(Binary Search Tree,BST)满足以下性质:左子树所有节点的值 < 根节点的值右子树所有节点的值 > 根节点的值左右子树本身也是二叉排序树示例:text50/ \30 70/ \ / \2…...
开发者必看:如何在自己的项目中集成 cryptocurrency-icons
开发者必看:如何在自己的项目中集成 cryptocurrency-icons 【免费下载链接】cryptocurrency-icons A set of icons for all the main cryptocurrencies and altcoins, in a range of styles and sizes. 项目地址: https://gitcode.com/gh_mirrors/cr/cryptocurren…...
