概念用途

特殊的列表

队列顾名思义,可以想一下银行排队的人,排在前面的先办理业务

用在很多地方,比如打印任务池

定义

队列只能队尾插入元素,队首删除元素

是一种 先进先出(FIFO) 的数据结构

插入元素叫做 入队,删除叫做 出队

特殊情况,删除元素不必遵守先进先出的约定,如急诊插队。这种我们需要 优先队列 的数据结构模拟

代码实现

  1. function Queue() {
  2. this.dataStore = []
  3. this.inQ = inQ
  4. this.outQ = outQ
  5. this.getFirst = getFirst
  6. this.getLast = getLast
  7. this.toString = toString
  8. this.clear = clear
  9. this.priorityOut = priorityOut
  10. }
  11. function inQ(ele) {
  12. this.dataStore.push(ele)
  13. }
  14. function outQ() {
  15. this.dataStore.shift()
  16. }
  17. function getFirst() {
  18. return this.dataStore[0]
  19. }
  20. function getLast() {
  21. return this.dataStore[this.dataStore.length - 1]
  22. }
  23. function toString() {
  24. return this.dataStore
  25. }
  26. function clear() {
  27. this.dataStore = []
  28. }
  29. var q = new Queue(),
  30. log = console.log
  31. q.inQ('a')
  32. q.inQ('b')
  33. // log(q.toString())
  34. // log(q.outQ())
  35. q.inQ('c')
  36. q.inQ('a')
  37. // log(q.toString())
  38. // log(q.getFirst())
  39. // log(q.getLast())
  40. // log(q.clear())
  41. // log(q.toString())
  42. // 优先队列
  43. // 改造 outQ 方法,遍历队列,优先取出最高级的,一次for 循环解决
  44. function priorityOut() {
  45. // 第一次写,写出了下面这个蠢东西
  46. // 实际上我只关心index, priority根本不需要记录,只要大于当前
  47. // var priority = 0,
  48. // index = 0
  49. // for (var i = 0; i<this.dataStore.length; i++) {
  50. // priority = this.dataStore[i].priority > priority ? this.dataStore[i].priority : priority
  51. // index = this.dataStore[i].priority > priority ? i : index
  52. // }
  53. //
  54. // 然后有了如下精妙的排序,这个应该是排序的一个算法。 淦 赶紧学吧
  55. var priority = 0
  56. for (var i = 1; i < this.dataStore.length; i++) {
  57. if (this.dataStore[i].priority > this.dataStore[priority].priority) {
  58. priority = i
  59. }
  60. }
  61. console.log(priority)
  62. return this.dataStore.splice(priority, 1)
  63. }
  64. function Person(name, priority) {
  65. this.name = name
  66. this.priority = priority
  67. }
  68. personArr = {}
  69. personArr.p1 = new Person('a', 4)
  70. personArr.p2 = new Person('d', 5)
  71. personArr.p3 = new Person('g', 2)
  72. personArr.p4 = new Person('h', 177)
  73. personArr.p5 = new Person('6', 11)
  74. var personQueue = new Queue()
  75. for (var i = 1; i <= 5; i++) {
  76. personQueue.inQ(personArr[`p${i}`])
  77. }
  78. log(personQueue.toString())
  79. personQueue.priorityOut()
  80. log(personQueue.toString())

PS:优先队列是改变传统队列的出队方法,使用排序获取最大的index,然后splice出来即可