括号匹配算法问题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]js获取json的key和value
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
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。