例如,考虑下列括号序列:
[ ( [ ] [ ] ) ]
1 2 3 4 5 6 7 8
当计算机接受了第一个括号后,它期待着与其匹配的第八个括号的出现,然而等来的却是第二个括号,此时第一个括号“[”只能暂时靠边,而迫切等待与第二个括号相匹配的、第七个括号“)”的出现,类似地,因等来的是第三个括号“[”,其期待匹配的程度较第二个括号更急迫,则第二个括号也只能靠边,让位于第三个括号,显然第二个括号的期待急迫性高于第一个括号;在接受了第四个括号之后,第三个括号的期待得到满足,消解之后,第二个括号的期待匹配就成为当前最急迫的任务了,……依此类推。
很显然,这样的一个处理过程和栈(后进先出)的特点非常吻合,因此,这个问题可以用栈来解决。
- 首先设置一个空数组,使用push来存放栈数据
- 用变量,来存储栈数据的最后一个数据,因为栈是后进先出,所以需要栈数据的最后一个数据,来和后面的数据做对比。如果匹配,则清除栈里的最后一个数据
// 模拟栈结构,后进先出,遇到一对就出栈,直到栈长度为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