一、是什么

使用栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈;
栈和队列 - 图1
使用队列存储数据,讲究 “先进先出”,即最先进队列的数据,也最先出队列。
栈和队列 - 图2

二、例题

1、逆波兰表达式求值

根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例: :::info 输入:tokens = [“2”,”1”,”+”,”3”,”
“]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 :::

思路

提前声明运算符对应的运算函数,将数字放进栈中,遇到运算符的时候将栈顶的两个数字提取出来做运算,然后再将运算结果存入栈中。
最后栈中存在唯一元素,即为结果。

  1. let evalRPN = function (tokens) {
  2. let stack = []
  3. for (let token of tokens) {
  4. let op = opMap[token]
  5. if (op) {
  6. let a = parseInt(stack.pop())
  7. let b = parseInt(stack.pop())
  8. let res = op(a, b)
  9. stack.push(res)
  10. } else {
  11. stack.push(token)
  12. }
  13. }
  14. return stack[0]
  15. }
  16. let opMap = {
  17. "+": (a, b) => b + a,
  18. "-": (a, b) => b - a,
  19. "*": (a, b) => b * a,
  20. "/": (a, b) => parseInt(b / a, 10),
  21. }

2.有效的括号

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例: :::info 输入:s = “()” 输出:true
输入:s = “(]” 输出:false :::

思路

先通过哈希表建立括号间的映射关系,然后将左括号放入栈中。当遇到右括号时,判断是否与栈顶元素形成映射,若是则出栈,若否则直接返回false.

  1. var isValid = function(s) {
  2. const len = s.length
  3. if (len === 1) return false
  4. const map = new Map()
  5. map.set('(', ')')
  6. map.set('{', '}')
  7. map.set('[', ']')
  8. // 栈先存进一个元素,避免删除栈顶元素时报错
  9. const stack = ['?']
  10. for (let i of s) {
  11. if (map.has(i)) {
  12. stack.push(i)
  13. } else {
  14. let tmp = stack[stack.length-1]
  15. if (map.get(tmp) === i) {
  16. stack.pop()
  17. } else {
  18. return false
  19. }
  20. }
  21. }
  22. return stack.length === 1 ? true : false
  23. };

3、二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例: :::info 输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <—-
/ \
2 3 <—-
\ \
5 4 <—- :::

思路

基本还是通过二叉树 BFS 的方法进行解决即可,只是在取值的时候每一层都去最右边的值,也就是从左到右遍历的时候记录到的最后一个值即可。

  1. var rightSideView = function(root) {
  2. const res = []
  3. if (!root) return res
  4. const queue = [root]
  5. while (queue.length) {
  6. let len = queue.length
  7. let last
  8. for (let i = 0; i < len; i++) {
  9. const node = queue.shift()
  10. if (node.left) {
  11. queue.push(node.left)
  12. }
  13. if (node.right) {
  14. queue.push(node.right)
  15. }
  16. if (node.val !== 'undefined') {
  17. last = node.val
  18. }
  19. }
  20. res.push(last)
  21. }
  22. return res
  23. };