2017-02-12 97 views
14

我写检查括号中的逻辑“(”和“)”括号的时候都混合但似乎有一个问题。这是因为我只是比较总的括号计数。找到一个字符串缺少大括号的JavaScript

这是我写的

function checkParanthesis(str){ 
 
    var depth=0; 
 
    for(var i in str){ 
 
    if(str[i] == "(" || str[i] == "{" || str[i] == "[") 
 
     depth++; 
 
    else if(str[i] == ")" || str[i] == "}" || str[i] == "]") 
 
     depth--; 
 
    } 
 
    
 
    if(depth !==0) return false; 
 
    
 
    return true; 
 
} 
 

 
console.log(checkParanthesis("() test"));

问:

但我怎么能检查多个括号元素? (){} []

例如,

输入:

"[(]) abcd" // should return false 
"[{()}] test" // should return true 

应该返回false(不是真的)

+0

最后一条语句是多余的,一个简单的检查,如果值是'!== 0'就足够了。 –

+0

更正!谢谢@RyanMcCullagh – TechnoCorner

+0

你必须跟踪开头的大括号,这样你就可以确定一个关闭的对应于最近仍然开放的。 – Ryan

回答

22

使用的阵列为堆叠来跟踪悬而未决的开幕括号:

function checkParanthesis(str){ 
    var stack=[]; 
    for(var i=0; i<str.length; i++){ 
    if(str[i] == "(" || str[i] == "{" || str[i] == "[") 
     stack.push(str[i]); 
    else if(str[i] == ")") { 
     if(stack.pop() != "(") { return false; } 
    } 
    else if(str[i] == "}") { 
     if(stack.pop() != "{") { return false; } 
    } 
    else if(str[i] == "]") { 
     if(stack.pop() != "[") { return false; } 
    } 
    } 

    return !stack.length; 
} 

你或许可以清理它是更具可读性,但基本上是:

  • 每当你找到开括号,把它添加到堆栈中。
  • 每当你看到一个右括号时,弹出栈,看看堆栈的顶部是一个与之匹配的括号。
    • 如果不是,则表示不匹配,因此您可以立即返回false
  • 如果你到最后,你没有发现任何错误,返回true如果堆栈是空的(即stack.length0)。

(注意我也改变了你的i in str循环,因为它会遍历性质上String.prototype。)

一个清理你可以做(​​但我不知道这使得代码更易读与否)将是把支架配对中的对象,与闭合字符作为密钥和相应的开口字符作为值。然后,查看当前角色存在作为重点in对象,如果是这样,则弹出栈,看看是否该密钥相匹配的值:

function checkParanthesis(str){ 
    var stack=[]; 
    var brace_pairings = { ")":"(", "}":"{", "]":"[" }; 
    for(var i=0; i<str.length; i++){ 
    if(str[i] == "(" || str[i] == "{" || str[i] == "[") { 
     stack.push(str[i]); 
    } else if(str[i] in brace_pairings) { 
     if(stack.pop() != brace_pairings[str[i]]) { return false; } 
    } 
    } 

    return !stack.length; 
} 
6

,而不是一个计数器,你可以使用一个栈,当看到一个开口支架时将一个令牌推入堆栈,并且在看到正确的时弹出堆栈。当不同类型的支架是在堆栈的顶部如果遇到右括号时,或者当堆栈为空,则该字符串是不平衡。

像这样的东西(不抛光和测试):

function checkParanthesis(str){ 
var stack = []; 
var open; 
for(var i in str){ 
    if(str[i] == "(" || str[i] == "{" || str[i] == "[") { 
    stack.push(str[i]); 
    } 
    else if(str[i] == ")" || str[i] == "}" || str[i] == "]") { 
    if (stack.length == 0) { 
     return false; 
    } 
    open = stack.pop(); 
    if (
     (open == '(' && str[i] != ')') 
     || (open == '[' && str[i] != ']') 
     || (open == '{' && str[i] != '}') 
    ) { 
     return false; 
    } 
    } 
} 

if (stack.length > 0) { 
    return false; 
} 

return true; 
} 
1

使用正则表达式来得到所有的括号中match()阵列...然后删除阵列的每端测试每个设置

function checkParanthesis(str) { 
 
    //hashmap to compare open/close braces 
 
    var closers = {'[': ']','(': ')','{': '}'}; 
 
    // create braces array 
 
    var parStack = str.match(/\(|\{|\[|\)|\}|\]/g) || []; 
 

 
    if (parStack.length % 2 !== 0) {//must have even number 
 
    return false; 
 
    } else { 
 
    while (parStack.length) { 
 
     // check each end of array against each other. 
 
     if (closers[parStack.shift()] !== parStack.pop()) { 
 
     //mismatch , we're done 
 
     return false; 
 
     } 
 
    } 
 
    return true; 
 
    } 
 

 
} 
 
console.log('no braces ', checkParanthesis("test")); 
 
console.log('matched ', checkParanthesis("() test")); 
 
console.log('mis matched ',checkParanthesis("[(]) abcd")); // should return false 
 
console.log('matched ',checkParanthesis("[{()}] test"));

+0

这个工作可以使用'[]()'? – Teepeemm

+0

@Teepeemm其实我不认为会这样 – charlietfl

0

阵列/堆叠/计数器读出的办法,从左至右的字符串。另一种方法是从内到外工作。

function checkParanthesis(str){ 
    while (str.indexOf('()')>=0 || str.indexOf('[]')>=0 || str.indexOf('{}')>=0) { 
    str = str.replace('()','').replace('[]','').replace('{}',''); 
    } 
    return str.length===0; 
} 

您可以使用正则表达式替换零件来执行全局替换和循环次数更少。缺点是你需要逃避一切:str.replace(/\(\)/g,'') et.c.