「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
主要特点
- LIFO 后进先出
- 线性结构
场景
- 书架
- 函数调用栈
栈的封装
class Stack {
// 初始化一个数组,用数组实现栈结构
constructor() {
this.items = []
}
// 获取当前栈元素个数
size() {
return this.items.length
}
// 增加元素
push(element) {
this.items.push(element)
}
// 删除元素
pop() {
this.items.pop()
}
// 查看栈顶元素
peek() {
let topElement = this.items[this.size()-1]
return topElement;
}
// 判空
isEmpty() {
return this.size === 0
}
// toString
toString() {
let res = ''
for (var i = this.size() - 1; i >= 0; i--) {
res += this.items[i] + ''
}
return res
}
}
主要方法:
- size()--获取当前栈里元素个数
- isEmpty()--判断栈是否为空
- toString()--输出栈里的所有元素
- push()--栈顶增加元素(入栈)
- pop()--栈顶删除元素(出栈)
- peek()--访问栈顶元素
测试
let stack = new Stack();
console.dir(Stack)
stack.push(1)
stack.push(5)
stack.push(8)
stack.pop()
stack.push(10)
console.log(stack.peek())
console.log(stack.isEmpty())
stack.toString()
console.log(stack.size())
结果
class Stack
10
false
3
题目一:十进制转二进制
给一个十进制数字,转换成二进制数字
function dec2Bin(num) {
let stack = new Stack()
while(num > 0) {
stack.push(num%2)
num = Math.floor(num/2)
}
console.log(num)
return stack.toString()
}
整体思路
短除法,将该数除以2取余数,再将整数部分再对2取余,不断循环,直到该数为0,最后将余数从后往前输出
9%2 => 1 9//2 => 4
4%2 => 0 4//2 => 2
2%2 => 0 2//2 => 1
1%2 => 1 1//2 => 0
=>1001
解题步骤
- 声明一个栈
let stack = new Stack() - 该数对二取余,将余数放入栈中
stack.push(num%2) - 该数对二向下取整,将整数重新赋值给该数,作为下一次循环
num = Math.floor(num/2) - 直到该数小于等于0才结束循环
while(num > 0) - 最后返回栈中的结果,由于栈是从栈顶往下输出的,所以最终出栈顺序即为我们想要的结果
return stack.toString()
题目二:有效的括号
解题思路
核心思想
1.借助map映射数据类型存储对应括号 2.左括号则入栈,右括号检测是否与栈顶括号匹配,匹配则出栈,不匹配直接返回false
解题步骤
1.长度为奇数,肯定不匹配,直接返回false 2.map存储对应括号 3.声明一个数组作为栈 4.遍历字符串 5.若为左括号,则入栈 6.否则即为右括号,则直接取栈顶元素看是否与之匹配,匹配则出栈,不匹配直接返回false 7.循环结束,栈空则全部匹配,不空则说明有左括号剩余,返回false
代码
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
if(s.length%2===1) return false
let map = new Map([
[')','('],
[']','['],
['}','{'],
])
let stack = []
for(let c of s) {
if(Array.from(map.values()).includes(c)) {
stack.push(c)
}else {
let top = stack[stack.length-1]
if(top !== map.get(c)) {
return false
}
stack.pop()
}
}
return stack.length === 0;
};