出入栈应用

188 阅读3分钟

以下题目来自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;
};


题目二:

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

例如:
输入: "([)]"
输出: 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/