2017-02-12 52 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.