zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    ComboBox.DoubleClick事件
    mktime 夏令时
    STL String的使用[转]
    加在电源后至进入操作系统前的计算机的行为
    C语言数据类型大小分析(基于VC2005编译器)
    linux线程同步之条件变量
    windows 下架设svn服务器(转载+修改) (非利用Google项目托管)
    浅尝《Windows核心编程》之内核对象
    C——数组与指针
    如何用U盘做系统启动盘WINPE 并且 利用WINPE安装Ghost
  • 原文地址:https://www.cnblogs.com/pomelott/p/9478437.html
Copyright © 2011-2022 走看看