美文网首页
《数据结构与算法JavaScript描述》- 第五章 队列练习

《数据结构与算法JavaScript描述》- 第五章 队列练习

作者: 尤小小 | 来源:发表于2019-01-03 16:20 被阅读3次

1.修改Queue类,形成一个Deque类。这是一个和队列类似的数组结构,允许从队列两端添加和删除元素,因此也叫双向队列。写一段测试程序测试该类

2.使用前端完成的Deque类来判断一个给定单词是否为回文

3.修改5-5中的优先队列,使得优先级高的额元素优先码也大。写一段程序测试你的改动

4.修改例5-5中的候诊室程序,使得候诊室内的活动可以被控制。写一个类似菜单系统让用户可以进行如下选择:
a.患者进入候诊室
b.患者就诊
c.显示等待就诊患者名单

{
    // 用数组实现一个队列
    function Queue() {
        this.dataStore = []
        this.enqueue = enqueue
        this.dequeue = dequeue 
        this.front = front 
        this.back = back 
        this.toString = toString
        this.empty = empty 
        this.count = count
    }

    // 队尾添加一个元素
    function enqueue(element) {
        this.dataStore.push(element)
    }

    // 删除队首的元素
    function dequeue() {
        return this.dataStore.shift()
    }

    // 读取队首的元素
    function front () {
        return this.dataStore[0]
    }

    // 读取队尾的元素
    function back() {
        return this.dataStore[this.dataStore.length - 1]
    }

    // 显示队列内的所有元素
    function toString() {
        var str = ''
        for(var i = 0; i < this.dataStore.length; i++) {
            str += this.dataStore[i] + '\n'
        }
        return str
    }

    // 判断队列是否为空
    function empty() {
        if (this.dataStore.length == 0) {
            return true
        } else {
            return false
        }
    }

    function count() {
        return this.dataStore.length
    }

    // 测试程序
    // var q = new Queue()
    // q.enqueue('gao')
    // q.enqueue('xiao')
    // q.enqueue('hei')
    // console.log(q.toString())
    // q.dequeue()
    // console.log(q.front())
    // console.log(q.back())

    // 方块舞
    function Dancer(name, sex) {
        this.name = name
        this.sex = sex 
    }

    var names = ['F 高甜甜', 'M 陈宇', 'M 周亚楠', 'M 李冬', 'F 王莎']
    function getDancers (names, males, females) {
        for(var i = 0; i < names.length; i++) {
            names[i] = names[i].trim()
            var dancer = names[i].split(' ')
            var sex = dancer[0]
            var name = dancer[1]

            if (sex == 'F') {
                females.enqueue(new Dancer(name, sex))
            } else {
                males.enqueue(new Dancer(name, sex))
            }
        }
    }

    function dance(females, males) {
        while (!females.empty() && !males.empty()) {
            var person = females.dequeue()
            console.log('女演员:'+ person.name)
            person = males.dequeue()
            console.log('男演员:' + person.name)
        }
    }

    // 测试程序
    // var maleDancers = new Queue()
    // var femaleDancers = new Queue()

    // getDancers(names, maleDancers, femaleDancers)
    // dance(femaleDancers, maleDancers)

    // if(!femaleDancers.empty()) {
    //     console.log('剩下女演员:' + femaleDancers.front().name)
    // } else {
    //     console.log('没有女演员了')
    // }
    // if(!maleDancers.empty()) {
    //     console.log('剩下男演员:' + maleDancers.front().name)
    // } else {
    //     console.log('没有男演员了')
    // }

    // if(femaleDancers.count() > 0) {
    //     console.log('女演员等候:'+femaleDancers.count())
    // }

    // if(maleDancers.count() > 0) {
    //     console.log('男演员等候:'+femaleDancers.count())
    // }


    // 使用队列对数据进行排序
    /**
     * 
     * @param {*} nums 需要排序的数据
     * @param {*} queues 空队列数组
     * @param {*} n 多少个数据 10个这里其实都可以在这一个方法里处理 根据数据来确定n的大小,以及根据数据的length实例化length个队列
     * @param {*} digit 表示个位或者十位上的值
     */
    function distribute(nums, queues, n, digit) {
        for(var i = 0; i < n; i++) {
            if(digit == 1) {
                queues[nums[i]%10].enqueue(nums[i]) // 余数是个位
            } else {
                queues[Math.floor(nums[i] / 10)].enqueue(nums[i]) // 商是十位
            }
        }
    }

    function collect(queues, nums) {
        var i = 0;
        for(var j = 0; j < 10; ++j) {
            while (!queues[j].empty()) {
                nums[i++] = queues[j].dequeue()
            }
        }
        console.log(nums)
    }

    function disArray(arr) { // 展示需要排序的数据
        for(var i = 0; i < arr.length; ++i) {
            // console.log(arr[i] + '')
        }
    }

    // 主程序
    var queues = []
    for(var i = 0; i < 10; ++i) { // 创建队列 有几个数据就创建几个队列 这里有10个数据就创建10个队列
        queues[i] = new Queue()
    }

    var nums = []    
    for(var i = 0; i < 10; i++) { // 创建10个0~100以内的数据,存放在nums数组里
        nums[i] = Math.floor(Math.random()*100)
    }

    // 测试程序
    // disArray(nums)
    // distribute(nums, queues, 10, 1) 
    // collect(queues, nums)
    // distribute(nums, queues, 10, 10) 
    // collect(queues, nums)

    /**
     * 优先队列
     * 从优先队列中删除元素时,需要考虑优先权的限制 医院急诊科的候诊室
     */

    function Patient(name, code) { // 存储队列元素的对象
        this.name = name
        this.code = code
    }

    // 寻找优先级最高的元素  优先码低的优先级越高
    function dequeue() {
        if(this.dataStore.length == 0) return  
        var codeIndex = this.dataStore[0].code
        var index = 0;

        for(var i = 0; i < this.dataStore.length; ++i) {
            if (this.dataStore[i].code < codeIndex) {
                index = i;
                
                return this.dataStore.splice(index, 1)
            }
        }

        return this.dataStore.splice(index, 1)
    }

    

    // 展示Patient对象 重新改写toString方法
    function toString() {
        var retStr = ''
        for(var i = 0; i < this.dataStore.length; ++i) {
            retStr += this.dataStore[i].name + ' code:' + this.dataStore[i].code + '\n'
        }

        return retStr 
    }

    
    
    var p = new Patient('xiaohei', 4)
    var ed = new Queue()
    ed.enqueue(p)
    console.log(p.name + ' 进入候诊名单')

    p = new Patient('heihei', 5)
    ed.enqueue(p)
    console.log(p.name + ' 进入候诊名单')

    p = new Patient('chouchou', 4)
    ed.enqueue(p)
    console.log(p.name + ' 进入候诊名单')

    p = new Patient('tiantian', 1)
    ed.enqueue(p)
    console.log(p.name + ' 进入候诊名单')

    p = new Patient('gaojianhei', 6)
    ed.enqueue(p)
    console.log(p.name + ' 进入候诊名单')



    console.log('等待就诊名单:' + '\n' + ed.toString())

    let jiuzhenPatient = ed.dequeue()
    console.log('-------')
    console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
    console.log('等待就诊名单:' + '\n' + ed.toString())

    jiuzhenPatient = ed.dequeue()
    console.log('-------')
    console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
    console.log('等待就诊名单:' + '\n' + ed.toString())

    jiuzhenPatient = ed.dequeue()
    console.log('-------')
    console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
    console.log('等待就诊名单:' + '\n' + ed.toString())

    jiuzhenPatient = ed.dequeue()
    console.log('-------')
    console.log(jiuzhenPatient[0]['name'] + ' 正在就诊')
    console.log('等待就诊名单:' + '\n' + ed.toString())
    // var seen = ed.dequeue()
    // console.log(seen.name)



    // 1.修改Queue类,形成一个Deque类。这是一个和队列类似的数组结构,允许从队列两端添加和删除元素,因此也叫双向队列。写一段测试程序测试该类
    // 用数组实现一个队列
    /**
     * 只需要添加四个方法 在队列两端添加和删除元素
     */
    function Deque() {
        this.dataStore = []
        this.enFrontQueue = enFrontQueue
        this.deFrontQueue = deFrontQueue
        this.enBackQueue = enBackQueue
        this.deBackQueue = deBackQueue
        this.front = front
        this.back = back
        this.toString = toString
        this.empty = empty
        this.count = count
    }

    // 双向队列头部添加元素
    function enFrontQueue(element) {
        this.dataStore.splice(0,0,element)
    }

    // 头部删除元素
    function deFrontQueue() {
        return this.dataStore.splice(0,1)
    }

    // 尾部添加元素
    function enBackQueue(element) {
        this.dataStore.push(element)
    }

    // 尾部删除元素
    function deBackQueue(element) {
        return this.dataStore.pop()
    }

    // 测试用例
    var q = new Deque()
    // 头部插入元素
    q.enFrontQueue('gao')
    // 头部插入元素
    q.enFrontQueue('xiao')
    // 尾部插入元素
    q.enBackQueue('hei')
    // console.log(q.dataStore) // ["xiao", "gao", "hei"]
    // 头部删除元素
    q.deFrontQueue()
    // console.log(q.dataStore) // ["gao", "hei"]
    // 尾部删除元素
    q.deBackQueue()
    // console.log(q.dataStore) // ["gao"]


    // 2.使用前端完成的Deque类来判断一个给定单词是否为回文

    function isHuiwen(str) {
        if (str.length == 0) return
        var newQ = new Deque()

        for(var i = 0; i < str.length; ++i ) {
            newQ.enBackQueue(str[i])
        }

        function toHuiwen() {
            if (newQ.count() == 1) {
                console.log('is')
                return true
            } 

            while (newQ.count() > 1) {
                if (newQ.deFrontQueue() == newQ.deBackQueue()) {
                    toHuiwen()
                } else {
                    console.log('not')
                    return false
                }
            }
        }
        toHuiwen()
    }
    
    // 测试用例
    // isHuiwen('exexe')

    // 3.修改5-5中的优先队列,使得优先级高的额元素优先码也大。写一段程序测试你的改动

    // 重写 dequeue()方法
    // 寻找优先级最高的元素 号码越高的优先级越高
    // function dequeue() {
    //     if (this.dataStore.length == 0) return

    //     var codeIndex = this.dataStore[0].code
    //     var index = 0;

    //     for (var i = 0; i < this.dataStore.length; ++i) {
    //         console.log(codeIndex)
    //         if (this.dataStore[i].code > codeIndex) {
    //             index = i;
    //             return this.dataStore.splice(index, 1)
    //         }
    //     }

    //     return this.dataStore.splice(index, 1)
    // }

    // 4.修改例5-5中的候诊室程序,使得候诊室内的活动可以被控制。写一个类似菜单系统让用户可以进行如下选择:a.患者进入候诊室 b.患者就诊 c.显示等待就诊患者名单

    // 分清时间点很重要 其次 尽量不要在方法中去打印,在调用之后打印
}

相关文章

网友评论

      本文标题:《数据结构与算法JavaScript描述》- 第五章 队列练习

      本文链接:https://www.haomeiwen.com/subject/djxqrqtx.html