http://www.pptjcw.com

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

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

    一、什么是“栈”

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

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

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

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

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

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

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

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

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

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

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

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

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

    三、求括号位置题目描述

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

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

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

    四、解题思路分析

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

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

    然后分几种情况来处理:
    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。

    提示:如果您觉得本文不错,请点击分享给您的好友!谢谢

    上一篇:excel入门教程:双十一之前,来做个30天价格走势图 下一篇:excel数据分析:二分钟,做一个Excel版的待办列表

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读