怎么在外汇局网站做结汇申报/百度竞价电话

怎么在外汇局网站做结汇申报,百度竞价电话,浙江省建设局房管科网站,phpcmsv9网站建设入门教程数据结构之栈(C语言) 栈1 栈的概念与结构2 栈的初始化和销毁2.1 栈的初始化2.2 栈的销毁 3 入栈函数与出栈函数3.1 入栈函数3.2 出栈函数 4 取栈顶数据,获取数据个数 和 判空函数4.1 取栈顶数据与获取数据个数4.1.1 取栈顶数据4.1.2 获取数据…

数据结构之栈(C语言)

    • 1 栈的概念与结构
    • 2 栈的初始化和销毁
      • 2.1 栈的初始化
      • 2.2 栈的销毁
    • 3 入栈函数与出栈函数
      • 3.1 入栈函数
      • 3.2 出栈函数
    • 4 取栈顶数据,获取数据个数 和 判空函数
      • 4.1 取栈顶数据与获取数据个数
        • 4.1.1 取栈顶数据
        • 4.1.2 获取数据个数
      • 4.2 判空函数
    • 5 真题实战(有效的括号)

1 栈的概念与结构

栈是一种特殊的线性表,特殊在于其规定只允许在栈固定的一端进行数据插入和删除操作。数据插入和删除数据元素的一端叫做栈顶,另一端叫做栈底。栈中的元素遵从先进后出的原则。(我们可以把栈看成枪的弹夹,先压入的子弹后击发,后压入的子弹先击发)
压栈:栈的插入操作叫做压栈/进栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。

本章使用数组来实现栈。
在这里插入图片描述
代码定义如下:

typedef int STDatatype;//对栈中存入的元素类型进行重命名,避免修改时误操作typedef struct Stack
{STDatatype* c;//所存入栈中的数据int top;//表示指向栈顶元素位置or栈顶数据的下一个位置int capacity;//表示栈的容量
}ST;

在上面代码中我们对在的每个节点中定义了三个变量,对于top这一项较为特殊,下文2.1中会对两种情况进行阐述。

2 栈的初始化和销毁

2.1 栈的初始化

我们应知在创建出一个新的栈后,这个新的栈应是一个空栈,如此也就意味着指向存储数据的指针STDatatype* c = NULL,表示容量的int capacity = 0。但对于top我们不能轻率的认为top == 0表示空栈时top所指向的是栈顶数据,如果这么认为的话会对后面的操作造成误导(比如对栈判空)。因为top既然在等于0时表示栈为空栈,而且top还指向着栈顶数据,那么此时在索引为0处(即top == 0处 )就应当存放有具体数据,然而此时栈却是空的,所以当top == 0表示空栈时top就不能指向着栈顶数据,而是指向栈顶数据的下一个位置。 反之同理,若想让top指向栈顶数据,则top == -1时才可表示空栈。(鱼和熊掌不可兼得,表示空栈为鱼,指向栈顶数据为熊掌)
如图所示:
在这里插入图片描述

//栈的初始化
void STInit(ST* pst)
{assert(pst);pst->c = NULL;//top指向栈顶数据的下一个位置pst->top = 0;//top指向栈顶数据//pst->top = -1;pst->capacity = 0;
}

我们之所以选择top指向栈顶元素的下一个位置这种定义,一是因为在诸多程序中变量为零都是判空的条件,如此设置有助于代码的一致性与可读性。二是因为top如此一来就可以等同于capacity的作用,直接反映栈中元素数量。三是因为简化了栈的判空并且减少了对栈边界的检查,top == 0时栈为空;最大容量为n时,top == n表示栈满。无需额外检查。

2.2 栈的销毁

由于本文中的栈是使用数组完成实现,故栈的销毁与顺序表的销毁一致。首先使用assert对数组断言(确定传参有效),然后释放掉动态内存,最后将top与capacity均置为0。
代码如下:

void STDestroy(ST* pst)
{assert(pst);free(pst->c);//释放动态内存pst->c = NULL;//首地址置为空pst->top = pst->capacity = 0;
}

3 入栈函数与出栈函数

3.1 入栈函数

经过初始化函数对栈进行操作后,数组为空,容量为零。所以在将数据压入栈中之前,我们要先对数组的容量进行检测,检查容量是否已满。如果满了,我们就进行扩容操作;反之,我们就直接插入即可。
对于内存函数的选择方面,由于扩容时会存在原本栈容量已经满的情况,此时不仅要扩大内存块,还要保留栈中原本的数据,所以应当选择realloc

void STPush(ST* pst, STDatatype x)
{assert(pst);//扩容if (pst->c == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDatatype* tmp = (STDatatype*)realloc(pst->c, newcapacity * sizeof(STDatatype));if (tmp == NULL){perror("realloc fail !");return;}pst->c = tmp;pst->capacity = newcapacity;}//扩容完毕后插入数据pst->c[pst->top] = x;//将数据插入到栈顶//注意这里要做出区分//此时top == 0 这个位置就是栈顶//但是top的指向是栈顶数据的下一个位置pst->top++;
}

3.2 出栈函数

出栈的操作只要在逻辑结构上将出栈数据移除即可,也就是通过索引top的加减完成出栈操作。此时有人可能会有疑问,既然其在物理结构上还存在于数组的内存块中,那么不会对栈满的判断造成影响吗?
因为我们在对top定义时,将其定义为指向栈顶数据的下一个位置,如此top==0就表示了空栈,top就表示栈中有几个数据,所以不会对栈满的判断造成影响。此外,当我们进行一次出栈后,出栈的数据虽然仍存在于数组的物理结构中,但是在下一次进行压栈操作后,刚才出栈数据的位置就会分配给新压入栈的数据,出栈的数据被新压入栈的数据覆盖掉。

void STPop(ST* pst)
{assert(pst);assert(pst->top > 0);//top表示栈中数据个数//当top==0时,栈已经成空栈,不能再进行出栈操作pst->top--;
}

4 取栈顶数据,获取数据个数 和 判空函数

4.1 取栈顶数据与获取数据个数

4.1.1 取栈顶数据

因为top是指向栈顶数据的下一个位置,所以要想获得栈顶数据,索引应当等于top - 1。
在这里插入图片描述
代码如下:

STDatatype STTop(ST* pst)
{assert(pst);//确保传参有效assert(pst->top > 0);//确保栈不为空return pst->c[pst->top - 1];//top - 1为栈顶数据
}
4.1.2 获取数据个数

top就代表着栈中的数据个数,所以直接返回top即可。
代码如下:

int STsize(ST* pst)
{assert(pst);return pst->top;
}

4.2 判空函数

根据我们前面的定义,top == 0时为空栈。所以判空过程中如果top等于零就是真(true),top不等于0就是假(false)。故我们将返回值类型设置为布尔类型,便于直观表现判空结果。
代码如下:

bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}

5 真题实战(有效的括号)

在这里插入图片描述
输出样例:
在这里插入图片描述
这个题当中我们之所以选择用栈来解答就是因为栈独特的后进先出的特性,根据题目要求我们可以得出每个右括号都要与最近的未闭合的左括号匹配,那么每当识别到左括号就将其压入栈中,当识别到右括号时就将刚压入栈的左括号出栈顶与之匹配,如果不匹配也就意味着字符串非有效。
按照上述思路我们来完成实现(前提是上文中栈的基本结构已经编写完毕):
初阶版:

//因输出结果为true与false,故返回值类型定位布尔类型
bool isValid(char* s) {ST st;STInit(&st);while(*s){//识别括号,是左括号入栈if(*s == '(' || *s == '[' || *s == '{'){STPush(&st , *s);}//不是左括号是右括号,刚进栈的左括号出栈顶与右括号匹配else{//取栈顶元素char top = STTop(&st);//出栈顶STPop(&st);//匹不匹配只需看不匹配情况即可,如果匹配就继续执行循环,不匹配直接结束函数if(top == '(' && *s != ')'|| top == '[' && *s != ']'|| top == '{' && *s != '}'){STDestroy(&st);//即使不匹配也要及时销毁栈,避免内存泄漏return false;}}//每完成一次压栈或出栈操作字符串数组索引向后移一位++s;}return true;
}

提交后发现给出的四个样例均可通过,但当字符串中只有一个"["时,运行结果错误。在这里插入图片描述
这是因为左括号数量比右括号多,当最后一个左括号被压入栈中之后,没有右括号与其匹配,左括号依然存在于栈中。而程序运行完并没有对栈中进行判空,所以结果出错。
修改后:

//因输出结果为true与false,故返回值类型定位布尔类型
bool isValid(char* s) {ST st;STInit(&st);while(*s){//识别括号,是左括号入栈if(*s == '(' || *s == '[' || *s == '{'){STPush(&st , *s);}//不是左括号是右括号,刚进栈的左括号出栈顶与右括号匹配else{//取栈顶元素char top = STTop(&st);//出栈顶STPop(&st);//匹不匹配只需看不匹配情况即可,如果匹配就继续执行循环,不匹配直接结束函数if(top == '(' && *s != ')'|| top == '[' && *s != ']'|| top == '{' && *s != '}'){STDestroy(&st);return false;}}//每完成一次压栈或出栈操作字符串数组索引向后移一位++s;}//匹配完如果栈不为空,说明左括号比右括号多,数量不匹配bool ret = STEmpty(&st);STDestroy(&st);return ret;
}

再次提交发现仍然存在报错,当字符串中只有一个"]"时,运行结果错误。
在这里插入图片描述
由于没有左括号压入栈中,所以在取栈顶元素时就触发了assert断言的报错。
故在取栈顶元素之前,也应对栈进行判空操作。
最终修改后:

//因输出结果为true与false,故返回值类型定位布尔类型
bool isValid(char* s) {ST st;STInit(&st);while(*s){//识别括号,是左括号入栈if(*s == '(' || *s == '[' || *s == '{'){STPush(&st , *s);}//不是左括号是右括号,刚进栈的左括号出栈顶与右括号匹配else{//如果栈为空,字符串只有一个右括号if( STEmpty(&st) ){STDestroy(&st);return false;}//如果栈不为空,进行匹配//取栈顶元素char top = STTop(&st);//出栈顶STPop(&st);//匹不匹配只需看不匹配情况即可,如果匹配就继续执行循环,不匹配直接结束函数if(top == '(' && *s != ')'|| top == '[' && *s != ']'|| top == '{' && *s != '}'){STDestroy(&st);return false;}}//每完成一次压栈或出栈操作字符串数组索引向后移一位++s;}//匹配完如果栈不为空,说明左括号比右括号多,数量不匹配bool ret = STEmpty(&st);STDestroy(&st);return ret;
}

在这里插入图片描述
提交通过,题目解答完毕。

全文至此结束!!!
写作不易,不知各位老板能否给个一键三连或是一个免费的赞呢(▽)(▽),这将是对我最大的肯定与支持!!!谢谢!!!(▽)(▽)

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

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

相关文章

datawhale组队学习--大语言模型—task4:Transformer架构及详细配置

第五章 模型架构 在前述章节中已经对预训练数据的准备流程(第 4 章)进行了介绍。本章主 要讨论大语言模型的模型架构选择,主要围绕 Transformer 模型(第 5.1 节)、详细 配置(第 5.2 节)、主流架…

BP神经网络+NSGAII算法(保真)

BP神经网络NSGAII算法 非常适合用来当作实验验证自己的结论,构建一个神经网络模型,并使用NSGAII多目标优化算法来实现多领域的毕业论文的设计。仅仅使用简单的matlab代码就可以实现自己的多目标优化任务。 BP神经网络算法 我的任务是预测三个变量的值…

3.23学习总结

字符串 String java.lang,String 类代表字符串,Java程序中所有的字符串文字都为此类的对象 字符串的内容是不会发生改变的,它的对象在创建之后不能呗更改 字符串的内存模型 当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。 …

01测试分类

一、按照测试目标分类 1、界面测试 肉眼所看到的一切,都需要进行测试。如,按钮的点击;输入框输入文本;下拉框的选择;其它的交互等。。。 前端开发在执行开发之前需要交互/设计的同学给出设计图(以图片的…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU(Gated Recurrent Unit)也称为门控循环单元,是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联,通过引入两个&qu…

Playwright + MCP:用AI对话重新定义浏览器自动化,效率提升300%!

一、引言:自动化测试的“瓶颈”与MCP的革新 传统自动化测试依赖开发者手动编写脚本,不仅耗时且容易因页面动态变化失效。例如,一个简单的登录流程可能需要开发者手动定位元素、处理等待逻辑,甚至反复调试超时问题。而MCP&#xf…

求职招聘网站源码,找工作招工系统,支持H5和各种小程序

招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…

发票查验/发票验真如何用Java实现接口调用

一、什么是发票查验?发票验真接口? 输入发票基本信息发票代码、发票号码、开票日期、校验码后6位、不含税金额、含税金额,核验发票真伪。 该接口也适用于机动车、二手车销售发票、航空运输电子客票、铁路电子客票等。 二、如何用Java实现接口…

html5-qrcode前端打开摄像头扫描二维码功能

实现的效果如图所示,全屏打开并且扫描到二维码后弹窗提醒,主要就是使用html5-qrcode这个依赖库,html5-qrcode开源地址:GitHub - mebjas/html5-qrcode: A cross platform HTML5 QR code reader. See end to end implementation at:…

JavaWeb基础-HTTP协议、请求协议、响应协议

一. HTTP协议 1. HTTP协议:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则 2. HTTP协议特点: ① 基于TCP协议:面向链接,安全 ② 基于请求-响应模型的:一…

数据建模流程: 概念模型>>逻辑模型>>物理模型

数据建模流程 概念模型 概念模型是一种高层次的数据模型,用于描述系统中的关键业务概念及其之间的关系。它主要关注业务需求和数据需求,而不涉及具体的技术实现细节。概念模型通常用于在项目初期帮助业务人员和技术人员达成共识,确保对业务需…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker:在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

23种设计模式-创建型模式-抽象工厂

文章目录 简介场景问题1. 风格一致性失控2. 对象创建硬编码3. 产品族管理失效 解决总结 简介 抽象工厂是一种创建型设计模式,可以生成相关对象系列,而无需指定它们的具体类。 场景 假设你正在写一个家具店模拟器。 你的代码这些类组成: 相…

案例:网络命名空间模拟隔离主机场景

场景描述 假设我们需要在同一台物理机上模拟两台独立的主机(Host A 和 Host B),它们分别位于不同的网络命名空间中,并通过虚拟以太网对(veth pair)进行通信。目标是展示网络命名空间的隔离性和跨命名空间的…

新闻发布时间抽取(二)

1. 再论抽取方法 在前一期实验中,对gne组件进行分析和完善,对三种时间抽取的方法进行了实验对比。 在对抽取结果进行个例分析的过程中,我发现此前实验存在几个问题: 抽取的1000篇新闻存在一定的重复,经过ID去重大约减…

算法基础——栈

一、栈的概念 栈是⼀种只允许在⼀端进⾏数据插⼊和删除操作的线性表。 进⾏数据插⼊或删除的⼀端称为栈顶,另⼀端称为栈底。不含元素的栈称为空栈。进栈就是往栈中放⼊元素,出栈就是将元素弹出栈顶。 二、栈的模拟实现 1. 创建 本质还是线性表&#…

软考复习-传输介质与编码

传输介质 双绞线 传输距离100一200m,即网线,有多种分类 UTP非屏蔽双绞线 STP屏蔽双绞线 线序标准有两种为: T568A标准:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕 T568B标准:橙白、橙、绿白、蓝、蓝白、绿、棕白、…

【算法】常见排序算法(插入排序、选择排序、交换排序和归并排序)

文章目录 前言一、排序概念及常见排序算法框图1.排序概念2.常见排序算法框图 二、实现比较排序算法1.插入排序1.1 直接插入排序1.2 希尔排序 2.选择排序2.1 直接选择排序2.2 堆排序 3.交换排序3.1 冒泡排序3.2 快速排序3.2.1 hoare版本3.2.2 挖坑法3.2.3 lomuto前后指针 3.3 快…

电动自行车/电动工具锂电池PCM方案--SH367003、SH367004、SH79F329

在消费电子系统中,如手机电池包,笔记本电脑电池包等,带有控制IC、功率MOSFETFE管以及其他电子元件的电路系统称为电池充放电保护板Protection Circuit Module (PCM),而对于动力电池的电池管理系统&#xff…

【基于ROS的A*算法实现路径规划】A* | ROS | 路径规划 | Python

### 记录一下使用Python实现ROS平台A*算法路径规划 ### 代码可自取 :Xz/little_projecthttps://gitee.com/Xz_zh/little_project.git 目录 一、思路分析 二、算法实现 三、路径规划实现 一、思路分析 要求使用A*算法实现路径规划,可以将该任务分为三…