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

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

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

相关文章

自学python,学了又忘,感觉学不好是为啥呢

一、前言 最近发现&#xff0c;身边很多的小伙伴学Python都会遇到一个问题&#xff0c;就是资料也看了很多&#xff0c;也花了很多时间去学习但还是很迷茫&#xff0c;时间长了又发现之前学的知识点很多都忘了&#xff0c;都萌生出了想半路放弃的想法。 其实造成这样情况根本的…

使用toad库进行机器学习评分卡全流程

1 加载数据 导入模块 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import numpy as np import math import xgboost as xgb …

搭建 elasticsearch8.8.2 伪集群 windows

下载windows 版本 elasticsearch8.8.2 以下链接为es 历史版本下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic windows 单节点建立方案&#xff1a; 下载安装包 elasticsearch-8.8.2-windows-x86_64.zip https://artifacts.elastic.co/download…

element-plus:el-date-picker日期只选择年月不要日

<el-date-picker v-model"value" type"month" format"YYYY-MM" value-format"YYYY-MM" />使用format属性将时间显示格式修改为YYYY–MM 年月格式 使用value-format将绑定值的格式修改为YYYY–MM年月格式

一台电脑给另外一台电脑共享网络

这里写自定义目录标题 有网的电脑上操作一根网线连接两台电脑没网的电脑上 有网的电脑上操作 右键->属性->共享 如同选择以太网&#xff0c;勾选。确认。 一根网线连接两台电脑 没网的电脑上 没网的电脑为mips&麒麟V10 新增个网络配置ww&#xff0c;设置如下。 …

携手区块链技术,踏上可信“双碳”之路 | 研讨会回顾

自中央明确提出碳达峰碳中和的“双碳”目标以来&#xff0c;区块链技术凭借能为碳排放、碳足迹打上可信标签的天赋异禀&#xff0c;引起了政策部门、学术界及产业实践代表们的高度重视。 7月11日&#xff0c;在第33个全国节能宣传周之际、全国低碳日前夕&#xff0c;微众区块链…

R语言安装包Seurat

环境Ubuntu22&#xff0c;R4.1 also installing the dependencies ‘curl’, ‘openssl’, ‘httr’, ‘plotly’ R包安装的时候报了这个错误ERROR: dependencies httr, plotly are not available for package Seurat 解决方法&#xff0c;退出R&#xff0c;在terminal中键入…

C# OpenCvSharp 读取rtsp流

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using Syste…

k8s --pod详解

目录 一、Pod基础概念 1、pod简介 2、在Kubrenetes集群中Pod有如下两种使用方式 3、pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储。 &#xff08;1&#xff09;网络 &#xff08;2&#xff09;存储 4、kubernetes中的pause容器主要为每个容器提供…

24届近5年南京理工大学自动化考研院校分析

今天学长给大家带来的是南京理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、南京理工大学 ​ 学校简介 南京理工大学是隶属于工业和信息化部的全国重点大学&#xff0c;学校由创建于1953年的新中国军工科技最高学府——中国人民解放军军事工程学院&#xf…

最小二乘问题和非线性优化

最小二乘问题和非线性优化 0.引言1.最小二乘问题2.迭代下降法3.最速下降法4.牛顿法5.阻尼法6.高斯牛顿(GN)法7.莱文贝格马夸特(LM)法8.鲁棒核函数 0.引言 转载自此处&#xff0c;修正了一点小错误。 1.最小二乘问题 在求解 SLAM 中的最优状态估计问题时&#xff0c;我们一般…

linux gcc __attribute__

__attribute__ 1. 函数属性1.1 __attribute__((noreturn))1.2 __attribute__((format))1.3 __attribute__((const)) 2. 变量属性2.1. __attribute__((aligned))2.2. __attribute__((packed)) 3. 类型属性 __attribute__ 是 GCC 编译器提供的一种特殊语法&#xff0c;它可以用于…

论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》

题目&#xff1a;基于Transformer的无监督心电图&#xff08;ECG&#xff09;信号异常检测 摘要 异常检测是数据处理中的一个基本问题&#xff0c;它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易&#xff0c;然而&#xff…

CVPR 2023 | 无监督深度概率方法在部分点云配准中的应用

注1:本文系“计算机视觉/三维重建论文速递”系列之一,致力于简洁清晰完整地介绍、解读计算机视觉,特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。本次介绍的论文是:2023年,CVPR,…

vcode开发go

配置环境变量 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 创建文件夹 mkdir hello cd hello go mod help go mod help 初始化一个项目 go mod init hello 获取第三方包 go get github.com/shopspring/decimal 将依赖包下载到本地 go mod …

【Docker】Docker的应用场景,Docker 的优点,Ubuntu Docker 安装,使用 Shell 脚本进行安装

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

探究使用HTTP爬虫ip后无法访问网站的原因与解决方案

在今天的文章中&#xff0c;我们要一起来解决一个常见问题&#xff1a;使用HTTP爬虫ip后无法访问网站的原因是什么&#xff0c;以及如何解决这个问题。我们将提供一些实际的例子和操作经验&#xff0c;帮助大家解决HTTP爬虫ip无法访问网站的困扰。 1、代理服务器不可用 使用HT…

【Linux进阶之路】进程(上)

文章目录 前言一、操作系统加载过程二、进程1.基本概念2.基本信息①运行并观察进程②创建子进程③僵尸与孤儿进程&#xff08;父子进程衍生出来的问题&#xff09;1. 僵尸进程&#xff08;Zombie状态&#xff09;2. 孤儿进程 3.基本状态①操作系统的状态&#xff08;统一&#…

系列3-常见的高可用MySQL解决方案

高可用主要解决两个问题&#xff0c;如何实现数据共享和同步数据、如何处理failover&#xff0c;数据共享的解决方案一般是SAN&#xff0c;数据同步通过rsync和drbd技术来实现。 1、主从复制解决方案 这是MySQL自身的高可用解决方案&#xff0c;数据同步方法采用的是MySQL rep…

【图像去噪】基于混合自适应(EM 自适应)实现自适应图像去噪研究(Matlab代码实现)

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