以下题目来自leetcode。
今天在leetcode学习了数据结构栈,虽然一直知道栈,但是从来没有实践过,简单了解其原理后,看到第一道题目(本文题目二)就懵逼了...然后我就跳过了它,看到题目一,我用不是栈递减的方法实现了一下成功了。。接着开始学习怎么用栈递减方法实现,仔细研究了一下,发现真的蛮有意思的。 后来我成功地自己解决了题目二和题目三(鼓励一下,加油!土拨)。
题目一:
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
思路:
1、当前元素 < 栈顶元素 ,当前元素入栈
2、当前元素 > 栈顶元素, 弹出栈顶元素,当前元素入栈
演示图:
var dailyTemperatures = function(temperatures) {
let res = Array.from({length:temperatures.length},x=>0);
let stack = [];
for(let i=0; i<temperatures.length; i++){
while(stack.length>0 && temperatures[stack[stack.length-1]]<temperatures[i]){
let j = stack.pop();
res[j] = i-j;
}
stack.push(i);
}
return res;
};题目二:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
例如:
输入: "([)]"
输出: false思路:
1、当首先出现‘{’、'['、'('时将其压入栈中
2、当出现‘}’、‘]’、‘)’时,取出栈顶部的一个元素,判断能否合成“{}”或“[]”或'()'.
3、如果栈中不存在“{”或“[”或"("直接返回false
var isValid = function(s) {
let res;
let arr = s.split("");
let stack = [];
if(arr.length<1){
res = true
return res
}else if(arr.length<2){
res = false
return res
}
let match = {
'{': (r) =>{
if(r != '}'){
return false
}
return true
},
'[': (r) =>{
if(r != ']'){
return false
}
return true
},
'(': (r) =>{
if(r != ')'){
return false
}
return true
}
}
for(var i =0;i<arr.length;i++){
if(arr[i] === '{' || arr[i] === '[' || arr[i] === '('){
stack.push(arr[i]);
}else{
let left = stack.pop();
if(left){
res = match[left](arr[i]);
if(!res){
return res;
break
}
}else{
return res = false
}
}
}
if(stack.length>0){
res = false
}
return res
};
题目三:
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
- 整数除法只保留整数部分。
- 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
例如:
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6思路:
1、遇到数组推入栈中,
2、遇到运算符,从栈中取出两个数组,加入运算。
var evalRPN = function(tokens) {
var stack = [];
var calculate = {
"+":(a,b) =>{
return a+b
},
"-":(a,b) =>{
return a-b
},
"*":(a,b) =>{
return a*b
},
"/":(a,b) =>{
return parseInt(a/b)
}
}
tokens.forEach(function(i){
if(i != "+" && i != "-" && i != "*" && i != "/"){
stack.push(Number(i));
}else{
var b = stack.pop();
var a = stack.pop();
stack.push(calculate[i](a,b))
}
})
return stack[0]
};
总结一下:(元素)推入栈,取出比较,然后循环直至结束。
本文题目及学习资料:
https://leetcode-cn.com/explore/learn/card/queue-stack/218/stack-last-in-first-out-data-structure/