括号匹配问题的应用-从括号中取值-数据结构栈的应用

括号匹配问题的应用-从括号中取值-数据结构栈的应用

需求场景

最近碰到了一个括号匹配的问题,需要将括号中的内容,转化成对应的逻辑表达式。
这里拿AND()和OR()方法举例。
AND():括号中输入的逻辑表达式必须同时满足,则为true,否则为false
用法:AND(逻辑表达式1,逻辑表达式2,…)

OR():如果任意参数为真,OR 函数返回布尔值true;如果所有参数为假,返回布尔值false。
用法:OR(逻辑表达式1,逻辑表达式2,…)

其中ANDOR表达式之间可以互相嵌套

如图所见:
在这里插入图片描述
我需要将AND和OR组成的表达式,转化为红色字体的逻辑表达式,并且需要考虑到AND和OR是可以相互嵌套的,之后便想到了数据结构中栈的应用,可以通过栈的应用来解决匹配括号的问题,并且输出组合成新的表达式。

我这篇文章中有用C语言实现栈的基本操作:C语言栈的实现

下面来简单的描述一下栈是什么,为什么称它为一种数据结构。
大家可以想象一下手枪的弹夹。
在这里插入图片描述
首先手枪每一次的射击,弹夹都会从最顶上推入一个子弹,那么在装填子弹到时候也是自上而下的装填子弹,一颗颗的塞入,这便是一个栈,当然也有双向栈,这都是数据结构的设计。那么在括号匹配中就可以用到栈的思想来匹配括号。

在这里插入图片描述

解决方案

AND(多行文本 ==123,数字 ==123,0R ( 数字 ==123 ,数字==456))
(“多行文本”==123 &&“数字”==123 &&(“数字”==123 || “数字”==456))

将它转化为逻辑表达式的时候,存在的问题是
AND括号中的“ ,”在转化的时候需要转换成 &&,OR括号中的“,”需要转化成 || ,其余的字符不变。

解决方案:
1.定义一个栈,用来存放AND和OR
2.遍历字符串,如果是‘AND(’或者是‘OR(’则入栈,并且遍历下标往后移动
3.遍历字符串,如果碰到了“,”则按照栈顶元素是AND还是OR,来转化成&&或者||
4.如果碰到了‘)’则弹出栈顶元素
5.其余的字符串都直接进行拼接
6.最后输出的便是转化后的字符串,根据业务需要,再做进一步的拼接
代码:

// 	  通过出入栈的方式进行括号的匹配以及转化表达式
      convertString(str) {
        let stack = []; // 定义一个栈用于存储AND/OR 
        let res = ''; // 存储转换后的字符串
        for (let i = 0; i < str.length; i++) {
          if (str.substr(i, 4) === 'AND(') {
            stack.push(str.substr(i, 4)); // 将 AND( 入栈
            i += 2; // 跳过 AND(
          } else if (str.substr(i, 3) === 'OR(') {
            stack.push(str.substr(i, 3)); // 将 OR( 入栈
            i += 1; // 跳过 OR(
          } else if (str[i] === ',') {
            if (stack[stack.length - 1] === 'AND(') {
              // 栈顶是 AND(,将 , 替换为 &&
              res += '&&';
            } else if (stack[stack.length - 1] === 'OR(') {
              // 栈顶是 OR(,将 , 替换为 ||
              res += '||';
            }
          } else if (str[i] === ')') {
            res += str[i];
            stack.pop(); // 遇到 ),将 AND( 或 OR( 出栈
          } else {
            res += str[i]; // 普通字符直接加入结果字符串
          }
        }
        return res;
      },

至此解决

心得

自从毕业后一直接触的业务代码,之后去考研了,又复习了一遍专业课408,感叹颇深,尤其是教材数据结构的第7章图论,以及计算机网络,都让我动容,数字的力量和它的玄妙铸就科技的发展,也理解了计算机科学家往往和数据家密不可分。
工作2年了,踏实的基础可以帮助解决很多业务场景复杂的数据处理。
基础深,在技术这条路上就会有更深的突破,加油~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值