我正在写一个括号验证函数,在某些条件下似乎tmpStack.length
仍然是0
,即使在推入了一些元素之后。
对于"[(1+2)]"
或"[(1+2]"
这样的常规输入,该函数可以正常工作,但对于"[12"
之类的输入,它不起作用,因为tmpStack.length
仍为0
。困扰我的另一个问题是,如果输入是[
之类的单个括号,则函数返回true
,尽管它在初始验证中会失败。
function validator(str){
var flag=true;
var tmpStack=[];
var sliced = str.split("");
if (str.length<1 &&
((str!="(") || (str!=")") || (str!="[") ||
(str!="]") || (str!="{") || (str!="}")))
return flag;
else {
for(var i =0;i<=str.length;i++){
if((sliced[i]=="[") || (sliced[i]=="{") || (sliced[i]=="("))
tmpStack.push(sliced[i]);
else {
if((sliced[i]=="]" && tmpStack.pop()!="[") || (sliced[i]=="}" && tmpStack.pop()!="{" ) || (sliced[i]==")" && tmpStack.pop()!="("))
{
console.log("dis-match found for: "+(sliced[i]));
flag=false;
break;
}
}
}
}
if(tmpStack.length % 2)
return flag;
else
return !flag;
}
var tstStr="[+1";
console.log(validator(tstStr));
答案 0 :(得分:0)
当你发现错误时,你需要从函数返回,我想:
return false;
而不是
flag=false;
break;
我也没有做到这一点:
if(tmpStack.length % 2)
return flag;
else
return !flag;
似乎任何东西都留在数组中 - 如果应该返回false:
return tmpStack.length ? false : true;
或只是
return !tmpStack.length
<强>更新强>
重构解决方案:
function validator(str){
var tmpStack = [];
for (var i = 0; i < str.length; i++) {
if (str[i].match(/\[|\{|\(/)) {
tmpStack.push(str[i]);
} else if (
(str[i]=="]" && tmpStack.pop()!="[") ||
(str[i]=="}" && tmpStack.pop()!="{" ) ||
(str[i]==")" && tmpStack.pop()!="(")
) {
console.log("dis-match found for: " + (str[i]));
return false;
}
}
return !tmpStack.length;
}
var tstStr="[+]()1";
console.log(validator(tstStr));
&#13;