栈
栈的概念
后进先出的有序集合
栈的实现
// An highlighted block
class Stack {
constructor () {
// 存储栈的数据
this.data = {}
// 记录栈的数据个数(相当于数组的 length)
this.count = 0
}
// push() 入栈方法
push (item) {
// 方式1:数组方法 push 添加
// this.data.push(item)
// 方式2:利用数组长度
// this.data[this.data.length] = item
// 方式3:计数方式
this.data[this.count] = item
// 入栈后,count 自增
this.count++
}
// pop() 出栈方法
pop () {
// 出栈的前提是栈中存在元素,应先行检测
if (this.isEmpty()) {
console.log('栈为空!')
return
}
// 移除栈顶数据
// 方式1:数组方法 pop 移除
// return this.data.pop()
// 方式2:计数方式
const temp = this.data[this.count - 1]
delete this.data[--this.count]
return temp
}
// isEmpty() 检测栈是否为空
isEmpty () {
return this.count === 0
}
// top() 用于获取栈顶值
top () {
if (this.isEmpty()) {
console.log('栈为空!')
return
}
return this.data[this.count - 1]
}
// size() 获取元素个数
size () {
return this.count
}
// clear() 清空栈
clear () {
this.data = []
this.count = 0
}
}
const s = new Stack()
s.push('a')
s.push('b')
s.push('c')
题目
// 包含min的最小栈
// 在存储数据的栈外,再新建一个栈,用于存储最小值
class MinStack {
constructor () {
// stackA 用于存储数据
this.stackA = []
this.countA = 0
// stackB 用于将数据降序存储(栈顶值为最小值)
this.stackB = []
this.countB = 0
}
// 入栈
push (item) {
// stackA 正常入栈
this.stackA[this.countA++] = item
// stackB 如果没有数据,直接入栈
// 如果 item 的值 <= stackB 的最小值,入栈
if (this.countB === 0 || item <= this.min()) {
this.stackB[this.countB++] = item
}
}
// 最小值函数
min () {
return this.stackB[this.countB - 1]
}
// 获取栈顶值
top () {
return this.stackA[this.countA - 1]
}
// 出栈
pop () {
// 先进行 stackB 的检测
// 如果 stackA 的栈顶值 === stackB 的栈顶值,stackB 出栈
if (this.top() === this.min()) {
delete this.stackB[--this.countB]
}
// stackA 出栈
delete this.stackA[--this.countA]
}
}
const m = new MinStack()
/**
* @param {number[]} T 每日温度数组 [73, 74, 75, 71, 69, 72, 76, 73]
* @return {number[]} 等待天数列表 [1, 1, 4, 2, 1, 1, 0, 0]
*/
var dailyTemperatures = function(T) {
// 创建单调栈用于记录(存储索引值,用于记录天数)
const stack = [0]
let count = 1
// 创建结果数组(默认将结果数组使用 0 填充)
const len = T.length
const arr = new Array(len).fill(0)
// 遍历 T
for (let i = 1; i < len; i++) {
let temp = T[i]
// 使用 temp 比较栈顶值,如果栈顶值小,出栈(计算日期差,并存储),并重复操作
// - stack[count - 1] 代表栈顶值
while (count && temp > T[stack[count - 1]]) {
// 出栈
let index = stack.pop()
count--
// 计算 index 与 i 的差,作为 index 位置的升温日期的天数使用
arr[index] = i - index
}
// 处理完毕,当前温度入栈(等待找到后续的更大温度)
stack.push(i)
count++
}
return arr
}