栈结构

77 阅读1分钟

栈结构( TypeScript )

  • 一种只能在一端进行插入和删除操作的特殊线性表
  • 先进后出(First In Last Out)

利用数组实现类

// 利用TypeScript数组实现类
class ArrayStack<T> {
  // 使用数组维护内部栈数据
  private stackData: T[] = []

  // 压栈
  push(element: T): void {
    this.stackData.push(element)
  }
  // 弹出栈顶元素
  pop(): T | undefined {
    return this.stackData.pop()
  }
  // 查看栈顶元素
  peek(): T | undefined {
    return this.stackData[this.stackData.length - 1]
  }
  // 判断栈是否为空
  isEmpty(): boolean {
    return this.stackData.length === 0
  }
  // 返回元素个数
  size(): number {
    return this.stackData.length
  }
  
}

利用栈结构判断括号是否有效

对应力扣题目

function bracketsIsValid(s: string): boolean {
  const stack = new ArrayStack<string>()

  // 遍历字符串
  for (let i = 0; i < s.length; i++) {
    const bracket = s.charAt(i)
    // 取出对应单括号放入栈中
    switch (bracket) {
      case "(":
        stack.push(")")
        break
      case "{":
        stack.push("}")
        break
      case "[":
        stack.push("]")
        break
      default:
        // 弹出栈顶元素 判断是否与最近单括号匹配
        if (stack.pop() !== bracket) return false
    }
  }
  // 判断栈是否还有剩余括号
  return stack.size() === 0
}

栈结构实现十进制转化为二进制

function decimalToBinary(decimal: number): string {

  const stack = new ArrayStack<number>()
  let res: string = ""

  while(decimal !== 0) {
    // 存储余数
    const remainder = decimal % 2
    stack.push(remainder)

    // 对二进制数除二并向下取整
    decimal = Math.floor(decimal / 2)
  }

  while(!stack.isEmpty()) {
    res = res + "" + stack.pop()
  }

  return res
}