打卡-算法训练营-Day10 | 232.用栈实现队列;225. 用队列实现栈;20. 有效的括号;1047. 删除字符串中的所有相邻重复项

51 阅读1分钟

用栈实现队列

leetcode链接:leetcode.cn/problems/im…

用两个栈实现队列思路:

image.png

用队列实现栈

leetcode链接:leetcode.cn/problems/im…

用一个队列实现栈思路:

image.png

元素出队列后,又添加到队列的里面,直到最后一个的时候直接弹出

有效的括号

leetcode链接:leetcode.cn/problems/va…

思路:

  1. 遇到右括号入栈
  2. 遇到左括号就出栈
  3. 出栈后要判断出栈的元素与左括号类型匹不匹配
var isValid = function(s) {
    let size = s.length;
    let stack = [];
    let map = {
        ')': '(',
        '}': '{',
        ']': '['
    }

    for (let i = 0; i < size; i++) {
        // 遇到右括号入栈
        if (s.charAt(i) === '(' || s.charAt(i) === '[' || s.charAt(i) === '{') {
            stack.push(s.charAt(i));
        } else {
            // 遇到左括号就出栈
            let temp = stack.pop();
            // 出栈后要判断出栈的元素与左括号类型匹不匹配
            if (temp !== map[s.charAt(i)]) {
                return false;
            }
        }
    }

    return !stack.length;
};

可以尝试其他的思路(遇到右括号则左括号入栈)

删除字符串中的所有相邻重复项

leetcode链接:leetcode.cn/problems/re…

栈适合这类消消乐的操作,因为栈帮助我们记录了遍历数组当前元素时候,前一个元素是什么

思路:

  1. 元素在入栈前判断与栈顶元素是否相同
  2. 不相同则入栈
  3. 相同,不入栈,执行pop操作
var removeDuplicates = function(s) {
    let stack = [];
    let size = s.length;

    for (let i = 0; i < size; i++) {
        if (s.charAt(i) !== stack[stack.length - 1]) {
            stack.push(s.charAt(i));
        } else {
            stack.pop();
        }
    }

    return stack.join('');
};