重学Ts算法のStack

大家好我是安利君,最近也是在学习算法因此开始记录一下学习的心得。


Stack

理论

  1. 栈是一种受限制的线性结构,总会保持后进先出的原则(LIFO)
  2. LIFO 表示最后进入的元素会第一个弹出栈空间, 比如子弹弹匣,我最后压入弹匣的子弹往往会被第一个打出去。
  3. 向一个栈插入元素又称作进栈、入栈、压栈,他会把新元素放到栈顶元素的最上面。
  4. 从一个栈删除元素又称作出栈、退栈、弹栈,他会把最顶部的元素删除掉

注意: 栈只能从顶部放入或取出元素。

生活中例子:

如: 在一摞一次性纸杯中取纸币,或者电子邮件往往最后收到的邮件在最顶部。

栈结构示意图

如何实现一个栈

  1. 首先确定栈有哪些操作方法

push: 添加一个元素到栈顶

pop: 移除并返回栈顶元素

peek: 返回栈顶元素,注意这里只能查看不能操作

isEmpty: 返回布尔值此栈是否为空

size: 返回栈内部元素的个数 2. 创建实现类 实现类就是来实现接口中约定的内容,如果类或者接口中没有约定好的方法或属性则会报错,如果不使用Ts此步可省略。

TypeScript 复制代码
interface stack<T> {
  push(data: T): void
  pop(): T | undefined
  peek(): T | undefined
  isEmpty(): boolean
  size(): number
}
  1. 实现 基于数组实现一个栈结构,通过类的私有属性来规避原生数组的下标访问等方法,暴露给实例一些栈该有的方法。
TypeScript 复制代码
class ArrayStack<T = any> implements stack<T>{

  private arrayStack: Array<T> = []

  push(data: T): void {
    this.arrayStack.push(data)
  }
  pop(): T | undefined {
    return this.arrayStack.pop()
  }
  isEmpty(): boolean {
    return this.arrayStack.length === 0
  }
  size(): number {
    return this.arrayStack.length
  }
  peek(): T | undefined {
    return JSON.parse(JSON.stringify(this.arrayStack.at(-1)))
  }
}

应用

此题目来源于Leetcode20有效的括号,题解是自己做的。


题目: 给定一个只包括 `'('`,`')'`,`'{'`,`'}'`,`''\`,\`''` 的字符串 `s` ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

ini 复制代码
输入: s = "()"
输出: true

示例 2:

ini 复制代码
输入: s = "()[]{}"
输出: true

示例 3:

ini 复制代码
输入: s = "(]"
输出: false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

题解: 思路: 循环给定的字符串,判断是否能和栈顶元素组成闭合字符串如(),{},[],如果可以组成那么直接将栈顶元素弹出,如果不能组成则将当前字符串下标字符放入栈顶。当循环结束如果栈中无任何元素则表示字符串符合,否则不符合。

TypeScript 复制代码
function isValid(s: string): boolean {
  interface stack<T> {
      push(data: T): void
      pop(): T | undefined
      peek(): T | undefined
      isEmpty(): boolean
      size(): number
  }
  class ArrayStack<T = any> implements stack<T>{

      private arrayStack: Array<T> = []

      push(data: T): void {
          this.arrayStack.push(data)
      }
      pop(): T | undefined {
          return this.arrayStack.pop()
      }
      isEmpty(): boolean {
          return this.arrayStack.length === 0
      }
      size(): number {
          return this.arrayStack.length
      }
      peek(): T | undefined {
          return this.arrayStack.at(-1)
      }
  }
  const stack = new ArrayStack<String>()
  // let countStr = s
  const arr =['{}','()','[]']
  for(let i=0 ; i<s.length;i++){
    console.log(stack.peek());
    
      if(stack.size()>0 && arr.includes(stack.peek()+s[i])){
          stack.pop()
      }else{
          stack.push(s[i])
      }
  }
  return stack.size()===0
};
相关推荐
青少儿编程课堂2 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i2 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息3 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.4 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕4 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng5 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆6 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的6 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙7 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11337 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu