《數(shù)據(jù)結(jié)構(gòu)與算法JavaScript描述》- 第五章 隊(duì)列練習(xí)

1.修改Queue類比原,形成一個(gè)Deque類妥凳。這是一個(gè)和隊(duì)列類似的數(shù)組結(jié)構(gòu),允許從隊(duì)列兩端添加和刪除元素帜慢,因此也叫雙向隊(duì)列。寫一段測試程序測試該類

2.使用前端完成的Deque類來判斷一個(gè)給定單詞是否為回文

3.修改5-5中的優(yōu)先隊(duì)列,使得優(yōu)先級(jí)高的額元素優(yōu)先碼也大花枫。寫一段程序測試你的改動(dòng)

4.修改例5-5中的候診室程序,使得候診室內(nèi)的活動(dòng)可以被控制掏膏。寫一個(gè)類似菜單系統(tǒng)讓用戶可以進(jìn)行如下選擇:
a.患者進(jìn)入候診室
b.患者就診
c.顯示等待就診患者名單

{
    // 用數(shù)組實(shí)現(xiàn)一個(gè)隊(duì)列
    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
    }

    // 隊(duì)尾添加一個(gè)元素
    function enqueue(element) {
        this.dataStore.push(element)
    }

    // 刪除隊(duì)首的元素
    function dequeue() {
        return this.dataStore.shift()
    }

    // 讀取隊(duì)首的元素
    function front () {
        return this.dataStore[0]
    }

    // 讀取隊(duì)尾的元素
    function back() {
        return this.dataStore[this.dataStore.length - 1]
    }

    // 顯示隊(duì)列內(nèi)的所有元素
    function toString() {
        var str = ''
        for(var i = 0; i < this.dataStore.length; i++) {
            str += this.dataStore[i] + '\n'
        }
        return str
    }

    // 判斷隊(duì)列是否為空
    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())
    // }


    // 使用隊(duì)列對(duì)數(shù)據(jù)進(jìn)行排序
    /**
     * 
     * @param {*} nums 需要排序的數(shù)據(jù)
     * @param {*} queues 空隊(duì)列數(shù)組
     * @param {*} n 多少個(gè)數(shù)據(jù) 10個(gè)這里其實(shí)都可以在這一個(gè)方法里處理 根據(jù)數(shù)據(jù)來確定n的大小劳翰,以及根據(jù)數(shù)據(jù)的length實(shí)例化length個(gè)隊(duì)列
     * @param {*} digit 表示個(gè)位或者十位上的值
     */
    function distribute(nums, queues, n, digit) {
        for(var i = 0; i < n; i++) {
            if(digit == 1) {
                queues[nums[i]%10].enqueue(nums[i]) // 余數(shù)是個(gè)位
            } 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) { // 展示需要排序的數(shù)據(jù)
        for(var i = 0; i < arr.length; ++i) {
            // console.log(arr[i] + '')
        }
    }

    // 主程序
    var queues = []
    for(var i = 0; i < 10; ++i) { // 創(chuàng)建隊(duì)列 有幾個(gè)數(shù)據(jù)就創(chuàng)建幾個(gè)隊(duì)列 這里有10個(gè)數(shù)據(jù)就創(chuàng)建10個(gè)隊(duì)列
        queues[i] = new Queue()
    }

    var nums = []    
    for(var i = 0; i < 10; i++) { // 創(chuàng)建10個(gè)0~100以內(nèi)的數(shù)據(jù),存放在nums數(shù)組里
        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)

    /**
     * 優(yōu)先隊(duì)列
     * 從優(yōu)先隊(duì)列中刪除元素時(shí)馒疹,需要考慮優(yōu)先權(quán)的限制 醫(yī)院急診科的候診室
     */

    function Patient(name, code) { // 存儲(chǔ)隊(duì)列元素的對(duì)象
        this.name = name
        this.code = code
    }

    // 尋找優(yōu)先級(jí)最高的元素  優(yōu)先碼低的優(yōu)先級(jí)越高
    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對(duì)象 重新改寫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 + ' 進(jìn)入候診名單')

    p = new Patient('heihei', 5)
    ed.enqueue(p)
    console.log(p.name + ' 進(jìn)入候診名單')

    p = new Patient('chouchou', 4)
    ed.enqueue(p)
    console.log(p.name + ' 進(jìn)入候診名單')

    p = new Patient('tiantian', 1)
    ed.enqueue(p)
    console.log(p.name + ' 進(jìn)入候診名單')

    p = new Patient('gaojianhei', 6)
    ed.enqueue(p)
    console.log(p.name + ' 進(jìn)入候診名單')



    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類佳簸,形成一個(gè)Deque類。這是一個(gè)和隊(duì)列類似的數(shù)組結(jié)構(gòu)颖变,允許從隊(duì)列兩端添加和刪除元素生均,因此也叫雙向隊(duì)列。寫一段測試程序測試該類
    // 用數(shù)組實(shí)現(xiàn)一個(gè)隊(duì)列
    /**
     * 只需要添加四個(gè)方法 在隊(duì)列兩端添加和刪除元素
     */
    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
    }

    // 雙向隊(duì)列頭部添加元素
    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類來判斷一個(gè)給定單詞是否為回文

    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中的優(yōu)先隊(duì)列腥刹,使得優(yōu)先級(jí)高的額元素優(yōu)先碼也大马胧。寫一段程序測試你的改動(dòng)

    // 重寫 dequeue()方法
    // 尋找優(yōu)先級(jí)最高的元素 號(hào)碼越高的優(yōu)先級(jí)越高
    // 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中的候診室程序,使得候診室內(nèi)的活動(dòng)可以被控制衔峰。寫一個(gè)類似菜單系統(tǒng)讓用戶可以進(jìn)行如下選擇:a.患者進(jìn)入候診室 b.患者就診 c.顯示等待就診患者名單

    // 分清時(shí)間點(diǎn)很重要 其次 盡量不要在方法中去打印佩脊,在調(diào)用之后打印
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛙粘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子威彰,更是在濱河造成了極大的恐慌出牧,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抱冷,死亡現(xiàn)場離奇詭異崔列,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旺遮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赵讯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耿眉,你說我怎么就攤上這事边翼。” “怎么了鸣剪?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵组底,是天一觀的道長。 經(jīng)常有香客問我筐骇,道長债鸡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任铛纬,我火速辦了婚禮厌均,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘告唆。我一直安慰自己棺弊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布擒悬。 她就那樣靜靜地躺著模她,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懂牧。 梳的紋絲不亂的頭發(fā)上侈净,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音僧凤,去河邊找鬼用狱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拼弃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摇展,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼吻氧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盯孙,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鲁森,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后振惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歌溉,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年骑晶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痛垛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桶蛔,死狀恐怖匙头,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仔雷,我是刑警寧澤蹂析,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站碟婆,受9級(jí)特大地震影響电抚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竖共,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一蝙叛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肘迎,春花似錦甥温、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匣沼,卻和暖如春狰挡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背释涛。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工加叁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唇撬。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓它匕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窖认。 傳聞我的和親對(duì)象是個(gè)殘疾皇子豫柬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容