括号匹配的检验js版

258 阅读2分钟

 例如,考虑下列括号序列:

  [ ( [ ] [ ] ) ]

  1 2 3 4 5 6 7 8

  当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然而等来的却是第二个括号,此时第一个括号“[”只能暂时靠边,而迫切等待与第二个括号相匹配的、第七个括号“)”的出现,类似地,因等来的是第三个括号“[”,其期待匹配的程度较第二个括号更急迫,则第二个括号也只能靠边,让位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第四个括号之后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹配就成为当前最急迫的任务了,……依此类推。

  很显然,这样的一个处理过程和栈(后进先出)的特点非常吻合,因此,这个问题可以用栈来解决。

  1. 首先设置一个空数组,使用push来存放栈数据
  2. 用变量,来存储栈数据的最后一个数据,因为栈是后进先出,所以需要栈数据的最后一个数据,来和后面的数据做对比。如果匹配,则清除栈里的最后一个数据
// 模拟栈结构,后进先出,遇到一对就出栈,直到栈长度为0
function isValid(s) {
    if (s === '') return false
    if (s.length % 2 !== 0) return false
    let items = []
    for (let i = 0; i < s.length; s++) {
        let letter = items[items.length - 1]
        switch (s[i]) {
            case '(':
                items.push()
                break;
            case '{':
                items.push()
                break;
            case ')':
                if (letter === '(') {
                    items.pop()
                }
                break;
            case '}':
                if (letter === '{') {
                    items.pop()
                }
                break;
        }
    }
    return items.length === 0
}
console.log(isValid('{{))}')) // false
console.log(isValid('{{()}}')) // true

时序分析

' ( { } ) '

第一次判断

( 入栈 , items= [ ( ] ,letter = (

第二次判断

{ 入栈, items=[ ( { ], letter= {

第三次判断

} , 走到case } , 和letter做判断,和letter的值 { 相等,所以 items的最后一个元素 { ,出栈

第四次判断

, 走到case , 和letter做判断,和letter的值 相等,所以 items的最后一个元素 { ,出栈

最后 items的长度为0,全部匹配完毕,反回true

综述就是利用栈的后进先出的规则,遇到一对就出栈,直到栈的长度为0,返回true。表明全部匹配