栈结构、队列结构

413 阅读2分钟

栈结构

特点:后进先出 / 先进后出 并且只能在顶端操作

元素进栈操作

  1. 有一个执行环境栈,五个上下文。进栈时放在顶端,并且是顶端进栈,顶端出栈。
  2. 首先1进栈
  3. 然后2进栈
  4. 然后3进栈
  5. 现在进行出栈操作:此时只能 3 先出栈,因为只有这样才能让21 出栈

6. 此时 4 进栈,出栈,5 进栈

  1. 此时栈内还有执行上下文15 ,此时栈内会根据执行上下文的活跃度在站内进行调整, 如果接下来要执行的是1,则栈内发生变化为

一. 自己封装栈结构

创建栈结构就相当与创建栈结构的实例

   class Stack {
       container = [];
   
       // 进栈
       enter(value){
           this.container.unshift(value)
       }
       
       // 出栈
       leave(){
           return this.container.shift()
       }
       
       // 长度
       size(){
           return this.container.length
       }
       
       value(){
           // 克隆为了外部的操作修改内部的container
           return this.container.slice(0)
       }
   }
   

二. 趁热打铁~ 面试题

十进制转换为二进制

  1. 内置方法实现
  let num = 19870;
  num.toString(2);
  1. 自己实现
Number.prototype.deci = function deci(){
    // this => num
    // sk = new Stack 创建栈结构的实例
    let deciNum = this, sk = new Stack;
    if(deciNum === 0) return '0'
    while(deciNum > 0){
        let n = Math.floor(deciNum /2),
        m = deciNum % 2;
        sk.enter(m);
        deciNum = n;
    }
    return sk.value().join('')
}
let num = 19870;
console.log(num.deci())

队列结构

特点:排队 先进先出 后进后出

  1. 进入队列:首先1进入队列
  2. 然后2进入队列
  3. 然后3进入队列
  4. 开始出队列:首先1出队列

当进入队列的执行上下文有优先级时则需要进行

  1. 首先按照12345的顺序进入队列,1开始进入队列
  2. 然后2开始进入队列,此时2会和1进行优先级比较,1的优先级大于2,所以:
  3. 然后3开始进入队列,此时发现3的优先级要高于1和2,所以3要排在队列的头部
  4. 然后4开始进入队列,此时4和1、2比较发现优先级高于1和2,再和3进行比较,发现优先级与3相同,根据3和4进入队列的顺序,所以:

实现队列结构

class Queue {
    container = [];
    // element 元素  priority 优先级
    enter(element, priority = 0){
        let obj = {
            element,
            priority
        };
        // 如果进入队列的元素的优先级为0
        if(priority === 0) {
            // 添加到队列的队尾 
            this.container.push(obj);
            return;
        }
        
        // 用于判断某个元素是否进行处理过
        let flag = false;
        for(let i = this.container.length - 1; i>=0; i--){
            let item = this.container[i];
            if(item.priority >= priority){
                this.container.splice(i - 1, 0, obj);
                flag = true;
                break;
            }
        }
        !flag ? this.container.push(obj) : null;
    }
    leave(){
        rerrun this.container.shift();
    }
    size(){
        return this.container.length;
    }
    value(){
        return this.container.slice(0)
    }
}

趁热打铁~ 面试题:击鼓传花

// 有8个人进行击鼓传花游戏,每个人顺序标号从1到8,传到第五个人的时候,这个人退出该游戏。

function game(n, m){
    // 创建队列结构的实例
    let qe = new Queue;
    for(let i = 0; i< n; i++){
        qe.enter(i + 1);
    }
    
    while(qe.size() > 1){
        for(let i = 0; i< m - 1; i++){
            qe.enter(qe.leave())
        }
        qe.leave();
    }
    
    return  qe.value().toString();
}
console.log(8, 5)