括号匹配算法问题 JS

事例一:算法简述
a:遍历输入测试的字符串,模板括号字符加入数组(用于最后进行比较判断);
b:遍历字符串数组,先进行判断长度为空,在进行判断是否为奇偶数,如果是偶数,就进行下一步,比较算法为:遍历字符串数组,如果是右括号,就让它和前面一位的字符进行匹配,匹配成功就移除掉两个元素,然后从头遍历。匹配不成功就接着往下循环。如果到最后数组的元素长度为空,那么完全匹配,如果还有元素,就说明匹配不成功

var moduleJson = {//括号匹配模板,你可以增加别的匹配,比如“{}”,“<>”,等,只需写入moduleJson里面去 
    ")":"(",  
    "]":"["  

}  

var testStr = "([()]())()()";//测试字符串 
var tempSaveArray = [];//用于存储字符串的数组 
for(var i = 0;i<testStr.length;i++){//如果存在括号字符,就加入数组 
    for(var key in moduleJson){  
        if(testStr[i] == key||testStr[i]==moduleJson[key]){//如果字符串中存在json中的key 和value字符,就加入数组 
            tempSaveArray.push(testStr[i]);  
        }  
    }  
}  
if(tempSaveArray.length){  
    if((tempSaveArray.length%2)!=0){//如果括号的长度为奇数,肯定不匹配 
        console.log("括号不匹配");  
    }else{//如果字符串括号长度为偶数,就进行遍历数组,进行判断 12345 0 4 

        for(var j = 0;j<tempSaveArray.length;j++){
            //(((())))
            if(moduleJson[tempSaveArray[j]]){//如果是右括号,就和前一个进行匹配。
                //拿到数组前一位的字符,是否与自己匹配
                if(j>0){
                    console.log("前一个元素:"+j+tempSaveArray[j-1]+" 后一个元素"+moduleJson[tempSaveArray[j]]); 
                    console.log(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]);
                    if(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]){//说明两个括号进行了匹配,让其出栈
                            tempSaveArray.splice(j-1,2);
                            j=0;//从新遍历数组
                    }
                }  
            }
        } 

        if(tempSaveArray.length){//没有移除完毕
            console.log("括号不匹配");
        } else{
            console.log("括号匹配,恭喜你语法正确!"); 
        }
    }  
}else{  
    console.log("你输入的字符串不存在括号");  
} 

事例二:
定义了一个栈;定义了一个匹配用的字符串;
循环这个各种括号组成的字符串,判断当前这个符号是不是左括号,如果是则入栈,如果不是,则出栈,出栈元素与当前符号的相对应左括号匹配。
下面是代码

function check(str) {
  var arr = str.split('') // 将传入字符串转化为数组
  var stack = new Stack() // 新建栈
  var aString = '({[]})'  // 用来匹配的字符串
  var index = -1          //初始化下标

  for (var i = 0; i < arr.length; i++) {
    var item = arr[i]
    if ((index = aString.indexOf(item)) < 3) {   // 将每一项都用aString匹配,下标小于3就是左括号
      // 左括号,入栈
      stack.into(item)
    } else {
      // 右括号,栈列表出栈一个元素与之匹配
      var target = stack.out()
      // 如果出栈元素不存在,则这个右括号没有响应匹配的左括号,验证失败
      if (!target) {
        return false
      }
      // 取出与 item 对应的左括号与出栈元素匹配,不相等则验证失败
      if (target !== aString.charAt(5-index)) { 
        return false
      }
    }
  }
  // 循环匹配完成后,如果栈列表还有元素,则缺少与之匹配的右括号,验证失败
  if (stack.size()) {
    return false
  }
  // ok
  return true
}
    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/sinat_36422236/article/details/81115920
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞