一、栈的特性与使用
栈是一种特殊的线性表。栈与线性表的不同,体现在增和删的操作。
简单栈的特点可以用一句话来概括,先进后出(LIFO)顺序。
二、刷题:
1.有效的括号(20)
地址:https://leetcode-cn.com/problems/valid-parentheses/
解决方案:
循环输入的字符串,如果是等于左括号,将右括号压入栈中,全部压入栈后做出栈操作,直到栈清空。注意边界值。
var isValid = function (s) {
if (s.length % 2 !== 0) return false
let stack = []
for (let i = 0; i < s.length; i++) {
let c = s[i]
if (c === '(') { stack.push(')') }
else if (c === '[') { stack.push(']') }
else if (c === '{') { stack.push('}') }
else if (stack.length === 0 || stack.pop() != c) { return false }
}
return stack.length === 0
};
2.每日温度(剑指 Offer II 038. 每日温度)
地址:https://leetcode-cn.com/problems/iIQa4I/
尝试去维持一个递减栈
var dailyTemperatures = function (temperatures) {
const len = temperatures.length
const stack = []
const res = (new Array(len)).fill(0)
for (let i = 0; i < len; i++){
// 若栈不为0,且存在打破递减趋势的温度值
while(stack.length && temperatures[i] > temperatures[stack[stack.length-1]]){
// 将栈顶温度值对应的索引出栈
let top = stack.pop()
// 计算 当前栈顶温度值与第一个高于它的温度值 的索引差值
res[top] = i-top
}
// 注意栈里存的不是温度值,而是索引值,这是为了后面方便计算
stack.push(i)
}
return res
};
3.最小栈(155)
地址:https://leetcode-cn.com/problems/min-stack/
var MinStack = function() {
this.stack = []
};
/**
* @param {number} val
* @return {void}
*/
MinStack.prototype.push = function(val) {
this.stack.push(val)
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
this.stack.pop()
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
if(this.stack.length){
return this.stack[this.stack.length-1]
}else{
return
}
};
/**
* @return {number}
*/
MinStack.prototype.getMin = function() {
let minValue = Infinity
for(let i = 0 ; i < this.stack.length;i++){
if(this.stack[i] < minValue) {
minValue = this.stack[i]
}
}
return minValue
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(val)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.getMin()
*/