自助餐的盘子,后进先出。

基于数组的实现

  1. 选择题- 排除哪个不是栈推出来的结果
  2. 代码实现
const log = console.log

class Stack {
  //栈中的属性
  items = []
  
  constructor(){
    log(this)
  }

  push(element) {
    this.items.push(element)
  }

  pop() {
    if(this.items.length === 0) return null
    return this.items.pop()
  }
  
  peek() {
    if(this.items.length === 0) return undefin
    const index = this.items.length - 1
    return this.items[index]
  }

  isEmpty() {
    return this.items.length === 0
  }

  size() {
    return this.items.length
  }

  toString() {
    return `栈底 -> ` + this.items.join(' -> ')
  }
}

复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

十进制转二进制 100 => 1100 100

const toBin = (number) => {
  const stack = new Stack()

  while(number > 0) {
    stack.push(number % 2)
    number = Math.floor(number / 2)
  }
//   return stack.toString()
  let binaryString = ''
  while(!stack.isEmpty()) {
    binaryString += stack.pop()
  }
  return binaryString
}
log(toBin(100))
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

队列

排队上厕所,先进先出。

实现类型:1.队列 2.优先级队列

队列

//例子:击鼓传花
//队列
const log = console.log

class Queue {
  items = []
  
  constructor(){
    log(`前端`,this.items)
  }

  enqueue(element) {
    this.items.push(element)
  }
  dequeue() {
    return this.items.shift()
  }
  front() {
    return this.items[0]
  }
  isEmpty() {
    return this.items.length === 0
  }
  size() {
    return this.items.length
  }
  toString() {
    return `前端 -> ` + this.items.join(' -> ' + ` -> 后端`)
  }
}

const passGame = (nameList,targetNum) => {
  const queue = new Queue()
  nameList.forEach(item => {
    queue.enqueue(item)
  })
  
  while(queue.size() > 1){
    for(let i = 0; i < targetNum - 1; i++) {
      queue.enqueue(queue.dequeue())
    }
    queue.dequeue()
  }
  
  return queue.front()

}
// log(passGame(['Lily','lucy','tom','lilei','why'],3))
// log(passGame([1,2,3,4,5],3))
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

优先级队列

//优先级队列

const log = console.log

class QueueElement {
  constructor(element, priority) {
    this.element=element
    this.priority=priority
  }
}

class PriorityQueue {
  items = []
  
  enqueue = (element,priority) => {
    const obj = new QueueElement(element,priority)
    if(this.size() === 0) {
      this.items.push(obj)
      return
    }
    //变量
    let added = false
    for(let i=0; i<this.size(); i++) {
      if(obj.priority < this.items[i].priority) {
        this.items.splice(i, 0, obj)
        added = true
        //。。。。。。。。。。。
        break
      }
    }
    if(!added) this.items.push(obj)
  }
  dequeue() {
    return this.items.shift()
  }
  front() {
    return this.items[0]
  }
  isEmpty() {
    return this.items.length === 0
  }
  size() {
    return this.items.length
  }
  toString() {
    let result = ''
    this.items.forEach(item => result+=`${item.element},优先级:${item.priority} => `)
    return result
  }
  
}
let queue = new PriorityQueue()
queue.enqueue(4399,0)
queue.enqueue(439,350)
queue.enqueue(49,124)
queue.enqueue(99,50)
// queue.enqueue(499,-1)
log(queue.toString())
复制成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
晓露寝安浅云逍遥十漾轻拟