今天在codewars上做了一道題,如下
看上去就是驗證三種括號各種嵌套是否正確書寫,本來一頭霧水,一種括號很容易判斷, 但是三種怎么判斷!
本人只是個前端菜鳥,,不會什么高深的正則之類的。
於是,在群里一吼,有人這樣建議:
js 的正則雖然不支持平衡組 但是可以通過一些技巧來彌補 老夫只能說這么多了,天機不可泄露當然 也可以寫個小算法 搞個棧玩玩
樓主聽上去好厲害的樣子,雖然不懂什么平衡組正則,但是棧還可以想一下啊!!
於是,開始了思考,該怎樣用棧的思維來解出這個題呢?是將左邊括號都進入一個棧,右括號進入另一棧,然后怎么比較。不會,下一個;
在冥思苦想中,終於有了!
首先思路是這樣的:
定義了一個棧;定義了一個匹配用的字符串;
循環這個各種括號組成的字符串,判斷當前這個符號是不是左括號,如果是則入棧,如果不是,則出棧,出棧元素與當前符號的相對應左括號匹配。
下面是代碼
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 }
Stack是自己寫的一個棧構造函數,簡單的入棧,出棧,長度。
終於搞定了.