1、括号匹配

https://leetcode.cn/problems/valid-parenthese

  1. /**
  2. * 括号匹配
  3. */
  4. function isMatch(left, right) {
  5. if (left === '(' && right === ')') return true
  6. if (left === '{' && right === '}') return true
  7. if (left === '[' && right === ']') return true
  8. return false
  9. }
  10. function matchBraket(str) {
  11. const len = str.length
  12. if (len === 0) return true
  13. const leftSymbol = '({['
  14. const rightSymbol = ']})'
  15. const stack = []
  16. for (let i = 0; i < len; i++) {
  17. const s = str[i]
  18. if (leftSymbol.includes(s)) {
  19. // 包含左括号,进栈
  20. stack.push(s)
  21. } else if (rightSymbol.includes(s)) {
  22. // 包含右括号,拿出栈顶元素和当前元素匹配对比,如果为true则出栈
  23. const top = stack[stack.length - 1]
  24. if (isMatch(top, s)) {
  25. stack.pop()
  26. }
  27. }
  28. }
  29. return stack.length === 0
  30. }
  31. console.log(matchBraket("{[()]}"))

2、两个栈实现一个队列

https://leetcode.cn/problems/implement-queue-using-stacks/

  1. class MyQueue {
  2. constructor() {
  3. this.stack1 = []
  4. this.stack2 = []
  5. }
  6. /**
  7. * 入队
  8. */
  9. add(n) {
  10. this.stack1.push(n)
  11. }
  12. /**
  13. * 出队
  14. */
  15. delete() {
  16. // 1、讲stack1中的所有数据移动到stack中
  17. while (this.stack1.length) {
  18. const n = this.stack1.pop()
  19. if (n) {
  20. this.stack2.push(n)
  21. }
  22. }
  23. // 2、stack2.pop
  24. const res = this.stack2.pop()
  25. return res
  26. }
  27. length() {
  28. return this.stack2.length
  29. }
  30. }
  31. const res = new MyQueue()
  32. res.add(1)
  33. res.add(2)
  34. res.add(3)
  35. console.log(res.delete())
  36. console.log(res.delete())

3、反转单向链表

  1. /**
  2. * 创建链表
  3. * @param {*} arr
  4. * @returns
  5. */
  6. function createLinkList(arr) {
  7. const len = arr.length
  8. if (!len) throw new Error('arr is empty')
  9. let curNode = {
  10. value: arr[len - 1]
  11. }
  12. if (len === 1) {
  13. return curNode
  14. }
  15. for (let i = len - 2; i >= 0; i--) {
  16. curNode = {
  17. value: arr[i],
  18. next: curNode
  19. }
  20. }
  21. return curNode
  22. }
  23. /**
  24. * 反转
  25. * @param {*} listNode
  26. */
  27. function reverseLinkList(listNode) {
  28. // 定义指针
  29. let prevNode = undefined
  30. let curNode = undefined
  31. let nextNode = listNode
  32. // 以nextNode为主,遍历链表
  33. while (nextNode) {
  34. // 第一个元素,删掉next,防止循环引用
  35. if (curNode && !prevNode) {
  36. delete curNode.next
  37. }
  38. // 反转指针
  39. if (curNode && prevNode) {
  40. curNode.next = prevNode
  41. }
  42. // 整体向后移动指针
  43. prevNode = curNode
  44. curNode = nextNode
  45. nextNode = nextNode?.next
  46. }
  47. // 当nextNode为空时,此时curNode尚未设置next
  48. curNode.next = prevNode
  49. return curNode
  50. }
  51. const arr = [100, 200, 300, 400, 500]
  52. const list = createLinkList(arr)
  53. console.log('list', list)
  54. const list1 = reverseLinkList(list)
  55. console.log('list1', list1)