js数据结构之栈和队列的详细实现方法

队列

队列中我们主要实现两种:

1. 常规队列

2. 优先队列(实际应用中的排队加急情况等)

常规队列的实现方法如下:

// 常规队列
function Queue () {
    this.queue = [];
    this.enqueue = enqueue;  // 入队
    this.dequeue = dequeue;  // 出队
    this.front = front;  //  返回队首
    this.back = back;   // 返回队尾
    this.toString = toString;  // 返回队列
    this.empty = empty;  // 队列是否为空
    this.count = count;   // 显示当前队列的元素数量


    function enqueue (ele) {
        this.queue.push(ele)
    }


    function dequeue () {
        return this.queue.shift();
    }


    function front () {
        return this.queue[0];
    }


    function back () {
        return this.queue[this.queue.length-1]
    }

    function toString () {
        var que = ""
        for (var i=0; i<this.queue.length; i++) {
            que += (this.queue[i] + "
" )
        }

        return que;
    }

    function empty () {
        if (this.queue.length === 0) {
            return true;
        }else{
            return false;
        }
    }

    function count () {
        return this.queue.length;
    }
}

常规队列的应用之,队伍匹配(需要node环境):

// 队伍匹配example


const fs = require("fs")
var dancerList = fs.readFileSync("dancer.txt", "utf-8").split("
");

var female = new Queue();
var male = new Queue();


var finalList = dancerList.map(function(item){
    return {
        sex: item.split(" ")[0],
        name: `${item.split(" ")[1]} ${item.split(" ")[2]}`
    }
})



finalList.forEach(function(item){
    if(item.sex==="F"){
        female.enqueue(item);
    }else{
        male.enqueue(item);
    }
})


function dance (female, male) {
    while (!female.empty() && !male.empty()) {
        console.log("the next dancers are:");
        console.log(`${female.dequeue().name} & ${male.dequeue().name}
`)
    }
    if (!female.empty()) {
        console.log(`${female.front().name} is waiting !!`)
    }
    if (!male.empty()) {
        console.log(`${male.front().name} is waiting to dance......`)
    }
}

dance(female, male);

优先队列中主要增加了权重的比对,实现方法如下:

// 优先队列
// 入队者需要有priority属性,属性值范围为1 - this.queue.length-1
function PriorQueue () {
    this.queue = [];
    this.enqueue = enqueue;  // 入队
    this.dequeue = dequeue;  // 出队
    this.front = front;  //  返回队首
    this.back = back;   // 返回队尾
    this.toString = toString;  // 返回队列
    this.empty = empty;  // 队列是否为空
    this.count = count;   // 显示当前队列的元素数量


    function enqueue (ele) {
        this.queue.push(ele)
    }


    function dequeue () {
        var priorityNum;
        if(this.queue[0].priority){
            priorityNum = this.queue[0].priority;
        }
        for(var i=1; i<this.queue.length; ++i){
            console.log(i);
            if (this.queue[i].priority < priorityNum ) {
                priorityNum = i;
            }
        }
        return this.queue.splice(priorityNum, 1);
    }


    function front () {
        return this.queue[0];
    }


    function back () {
        return this.queue[this.queue.length-1]
    }

    function toString () {
        var que = ""
        for (var i=0; i<this.queue.length; i++) {
            que += (this.queue[i] + "
" )
        }

        return que;
    }

    function empty () {
        if (this.queue.length === 0) {
            return true;
        }else{
            return false;
        }
    }

    function count () {
        return this.queue.length;
    }
}

优先队列的使用方法如下:

var priority = new PriorQueue();
priority.enqueue({name: "leo", priority: 3});
priority.enqueue({name: "tate", priority: 4});
priority.enqueue({name: "kate", priority: 1});
priority.enqueue({name: "kevin", priority: 2});
console.log(priority.dequeue());
console.log(priority.dequeue());

栈是一种先进后出的结构,js中使用数组进行模拟

栈的实现方法如下:

function Stack () {

    this.stack = [];
    this.top = 0;
    this.push = push;  // 栈顶添加元素
    this.pop = pop;       // 栈顶删除元素,并返回
    this.peek = peek;       // 返回栈顶元素
    this.length = length    // 获取栈内元素数量
    this.clear = clear  // 清空栈


    function push (ele) {
        this.stack[this.top++] = ele;
    }

    function pop () {
        return this.stack[--this.top]
    }

    function peek () {
        return this.stack[this.top-1];
    }

    function length () {
        return this.top;
    }


    function clear () {
        this.top = 0;
    }
}
原文地址:https://www.cnblogs.com/pomelott/p/9478437.html