当前位置:首页 > 办公设计 > Office教程 > Excel函数式编程:求右括号位置

Excel函数式编程:求右括号位置

1年前 (2025-05-24)Office教程1380

Microsoft 365中增加了很多新函数,使用这些新函数可以实现其他编程语言中的部分数据或数组操纵技巧,拓展工作表函数解决问题的新思路。本文通过一个寻找第n个左括号对应右括号位置的例子来介绍使用工作表函数模拟“栈”操作的一种方法。

一、什么是“栈”

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

例如,我们可以把序号堆积入栈,然后当符合条件时,从栈顶一个一个移除,相当于后进栈的先移出栈。

 

二、Excel工作表函数模拟入栈和出栈操作

在Excel中,可以使用VSTACK函数达到增加栈顶元素的目的,例如将数字5堆积到栈顶:

同样,利用DROP函数可以实现移除栈顶元素的目的:

如果当前栈里只有一个元素,移除这个元素时会产生错误值:

为了避免上述情况的出现,我们可以给栈设置一个初始值,例如0,这样有进栈元素后再移除不会产生错误:

 

三、求括号位置题目描述

下面,我们来正式说这个题目。相关原数据和描述如下图所示:

简单说,就是找出字符串中第n个左括号{对应的右括号}的位置。

 

四、解题思路分析

因为要模拟栈的操作,所以可以先想想一下这个栈的元素构成,为了避免错误,给栈一个初始值0,然后栈顶保留待匹配的{编号,栈底保留累计进过栈的{个数。

然后分几种情况来处理:
1)当字符是{时,将这个{的编号,也即从左到右是第几个},加入栈顶。例如第一个{入栈时,将1加在栈顶,生成数组{1;0}。那么怎么知道当前这个{是第几个{呢,因为我们维护的栈最底端会记录累计入过栈的{数量,所以要加入栈顶的{的编号就是栈底的数字+1。

2)当字符是{时还有一步要执行,就是将当前的{是第几个加入栈底,也就是将第1步的编号加在数组最下面。例如第一个{入栈时,将1加在栈顶后,将1也加在栈底,生成数组{1;0;1}。当然,这个步骤,也可以不将编号直接堆积在数组下面增加数组长度,可以动态更新数组最后一个值为上述编号,例如将原来的初始值更新成1,然后再将1堆积在上面,形成数组{1;1},但是公式处理会长一些。每次循环到{的时候,都会这样操作,记录累计有多少个{入过栈。

3)当字符是}时,这个}肯定是和栈顶编号的{匹配的,因为括号之间不交叉。此时,会分两种情况:
第一种情况,当栈顶的编号不等于n时,将栈顶的{编号做出栈处理,意味着这个编号的{有}匹配了。
第二种情况,当栈顶的编号等于n时,意味着当前的}就是和第n个{匹配的},这时,输出当前}的位置即可。

4)当字符不是{或},维持栈不变。

举几个简单的例子来说明楼上的解题步骤。

例1:字符串为“{}{a,{b,c}}”,n=1,结果返回2。

第一个字符是{,因此编号1入栈,栈底也变成1。第二个字符是},此时因为栈顶的编号是1,等于n,所以这个}就是和第一个{对应的},因此返回当前}的位置2。

例2:字符串为“{{}}{{a,b},{b,c}}”,n=2,结果返回3。

第一个字符是{,因此编号1入栈,数组变成{1;0;1}。第二个字符是{,因此编号2入栈,数组变成{2;1;0;1;2}。第3个字符是},此时因为栈顶的编号是2,等于n,所以这个}就是和第一个{对应的},因此返回当前}的位置3。

例3:字符串为“{}{}{{a,b}{c,{d,e}}}”,n=4,结果返回10。

步骤和前面一样,只不过当栈顶不等于n的时候,就要将栈顶数字出栈,表示已经有}与之匹配了。

 

五、具体公式及简要说明

有了上面的基础,我们就可以写出以下公式:

=-REDUCE(0,ROW($1:99),LAMBDA(x,y,IF(@x<0,x,SWITCH(MID(A2,y,1),"{",VSTACK(MAX(x)+1,x,MAX(x)+1),"}",IF(@x=B2,-y,DROP(x,1)),x))))

公式简要说明如下:

=-REDUCE(
0, 栈底初始值设置为0
ROW($1:99), 每个字符的位置
LAMBDA(x, y,
IF(
@x < 0, 返回结果位置后,将位置变成负数,判断如果是负数就保持x不变。
x,
SWITCH(
MID(A2, y, 1), 遍历每个字符
"{", VSTACK(MAX(x) + 1, x, MAX(x) + 1), 如果字符是{,栈顶和栈底都增加当前{的编号
"}", IF(@x = B2, -y, DROP(x, 1)), 如果字符是},如果栈顶=n,则返回位置的负数(即-y),否则弹出栈顶元素。
x 如果是其他字符,都保持栈不变。
)
)
)
)

图文作者:超人

扫描二维码推送至手机访问。

欢迎转载或分享本篇文章。

本文链接:https://www.jcba123.com/article/1637

分享给朋友:

“Excel函数式编程:求右括号位置” 的相关文章

Excel核对两个表格数据是否一致,这几种方法简单得不行!

Excel核对两个表格数据是否一致,这几种方法简单得不行!

对于一名办公族来说,使用Excel核对数据是一项不可缺少的重要工作。那么,如何快速有效的核对两个表格数据是否一致呢?今天,小汪老师就来给大家介绍几种非常简单的法子!     方法一:选择性粘贴核对数据 如图所示,如果说Sheet1和Sheet2中两个表格需要...

传说中的手绘教程 | 教你用PPT手绘图形熊猫

传说中的手绘教程 | 教你用PPT手绘图形熊猫

今天,给大家分享一篇传说中的PPT手绘教程,手把手教你全面了解手绘的方法过程。相信大家学完以后一定会有所收获,当然,大家学完以后一定要举一反三,多动手操作一下哟! 插入素材图片 步骤一、首先,你可以去找一张素材图片,前期练习,大家不要找太复杂的哟,尽量简单点的图片,比较有特色的图片,然后【...

动态柱形图图表动画制作:菜鸟PPT动画之旅

动态柱形图图表动画制作:菜鸟PPT动画之旅

图表是一种数据的表现,它能够很快速的让我们分析出我们想要的数据。在PPT中图表是一种非常常见的素材,很多PPT都离不开图表的。今天易雪龙老师就要来说说如何在PPT中快速的让图表动起来。 插入图表 步骤一、切换到【插入】选项卡,在【插图】组中单击【图表】,然后在弹出的【插入图表】对话框中选...

Excel算年龄,这些公式会不会?

Excel算年龄,这些公式会不会?

如下图所示,希望根据B列的出生日期和C列的统计截至日期,来计算两个日期之间的间隔,希望得到的结果是xx年xx个月xx天的形式。 要计算两个日期之间的间隔,那就非DATEDIF函数莫属了。这个函数的写法为: =DATEDIF(开始日期,结束日期,返回的间隔类型) 第1参数和第2参数,可以引...

一次性搞懂Excel引用方式

一次性搞懂Excel引用方式

在说引用方式之前,有必要先说说公式的复制。 当咱们输入一个公式后,能够快速将公式复制到具有相同运算规则的其他单元格。 比如下图中,在D2单元格里使用公式“=B2*C2”计算出土豆的金额。 那底下的白菜、辣椒怎么算呢? 如果像下面这样操作,那肯定是二逼青年了: D3输入公式=B3*C3,回...

PPT将正方形的图片转变为圆形

PPT将正方形的图片转变为圆形

1.单击工具栏插入下的形状,在下拉菜单下选择椭圆。 2.按住shift键画出一个正圆,选中此圆形,单击工具栏绘图工具下的填充,在下拉菜单下选择图片或纹理,在下拉菜单中选择本地图片。 3.弹出选择图片的对话框,找到需要插入的图片,单击打开。 4.图片就已经填充...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。