Mardanjan / Blog

学习笔记(在issues里),一些小demo的源码在这里,demo在线地址会持续更新
1 stars 0 forks source link

算法:括号匹配 #42

Open Mardanjan opened 4 years ago

Mardanjan commented 4 years ago

image

Mardanjan commented 4 years ago
/**
 * 括号相关的算法题可能会用到栈
 */

//  封装一个栈
class Stack {
  // 栈
  array = []
  // 获取长度
  getLength () {
    return this.array.length
  }
  // 压入栈
  push (item) {
    return this.array.push(item)
  }
  // 取出栈
  pop () {
    let item = this.array[this.array.length - 1]
    this.array.length = this.array.length - 1
    return item
  }
  // 查看栈顶元素
  lookIndex () {
    return this.array[this.array.length - 1]
  }
}

/**
 * 括号匹配
 * 1.左括号入栈
 * 2.是否为右括号,右括号与栈顶的括号匹配的话出栈 , 不匹配就返回false
 * 3.遍历完字符串,如果栈时空的返回true,否则返回false
 */

let str = '()(({}[[)]]))'
let leftStr = ['(', '[', '{'], rightStr = [')', ']', '}']
let s = new Stack()
function kuoHaoPiPei (str) {
  for( let i = 0; i < str.length; i++) {
    if (leftStr.includes(str.charAt(i))) {s.push(str.charAt(i))}
    else if (rightStr.includes(str.charAt(i))) {
      if (match(s.lookIndex(), str.charAt(i))) {
        s.pop()
      } else {
        return false
      }
    }
  }
  return s.getLength() === 0 ? true : false
  function match (left, right) {
    if (left == '(' && right == ')') {return true}
    else if (left == '[' && right == ']') {return true}
    else if (left == '{' && right == '}') {return true}
    else {return false}
  }
}
console.log(kuoHaoPiPei(str))