重学Ts算法のStack
大家好我是安利君,最近也是在学习算法因此开始记录一下学习的心得。
Stack
理论
- 栈是一种受限制的线性结构,总会保持后进先出的原则(LIFO)
- LIFO 表示最后进入的元素会第一个弹出栈空间, 比如子弹弹匣,我最后压入弹匣的子弹往往会被第一个打出去。
- 向一个栈插入元素又称作进栈、入栈、压栈,他会把新元素放到栈顶元素的最上面。
- 从一个栈删除元素又称作出栈、退栈、弹栈,他会把最顶部的元素删除掉
注意: 栈只能从顶部放入或取出元素。
生活中例子: 如: 在一摞一次性纸杯中取纸币,或者电子邮件往往最后收到的邮件在最顶部。
栈结构示意图
如何实现一个栈
- 首先确定栈有哪些操作方法 push: 添加一个元素到栈顶 pop: 移除并返回栈顶元素 peek: 返回栈顶元素,注意这里只能查看不能操作 isEmpty: 返回布尔值此栈是否为空 size: 返回栈内部元素的个数
- 创建实现类 实现类就是来实现接口中约定的内容,如果类或者接口中没有约定好的方法或属性则会报错,如果不使用Ts此步可省略。
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 JSON.parse(JSON.stringify(this.arrayStack.at(-1)))
}
}
应用
此题目来源于Leetcode20有效的括号,题解是自己做的。
题目: 给定一个只包括 `'('`,`')'`,`'{'`,`'}'`,`'['`,`']'` 的字符串 `s` ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
题解:
思路: 循环给定的字符串,判断是否能和栈顶元素组成闭合字符串如(),{},[]
,如果可以组成那么直接将栈顶元素弹出,如果不能组成则将当前字符串下标字符放入栈顶。当循环结束如果栈中无任何元素则表示字符串符合,否则不符合。
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
};
转载自:https://juejin.cn/post/7316540469320515619