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

  1. 椓镒澹可以用來判斷一個算術(shù)表達(dá)式中的括號是否匹配浓体。編寫一個函數(shù),該函數(shù)接受一個算術(shù)表達(dá)式為參數(shù),返回括號缺失的位置助析。下面是一個括號不匹配的算術(shù)表達(dá)式的例子:2.3+ 23 / 12 + (3.14159*0.24

  2. 一個算術(shù)表達(dá)式的后綴表達(dá)式形式如下:op1 op2 operator 使用兩個棧犀被,一個用來存儲操作數(shù),另外一個用來存儲操作符外冀,設(shè)計并實(shí)現(xiàn)一個Javascript函數(shù)寡键,該函數(shù)可以將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,然后利用棧對該表達(dá)式求值雪隧。

  3. 現(xiàn)實(shí)生活中棧的一個例子是佩斯糖果盒西轩。想象一下你有一盒佩斯糖果,里面塞滿了紅色脑沿、黃色和白色的糖果藕畔,但是你不喜歡黃色的糖果。使用棧(有可能用到多個棧)寫一段程序庄拇,在不改變盒內(nèi)其他糖果疊放順序的基礎(chǔ)上注服,將黃色糖果移除。

{
     // 首先實(shí)現(xiàn)一個棧
    function Stack() {
        this.dataStore = []
        this.top = 0
        this.push = push
        this.pop = pop
        this.peek = peek
        this.length = length
        this.clear = clear
    }

    function push(element) {
        this.dataStore[this.top++] = element
    }

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

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

    function length() {
        return this.top
    }

    function clear() {
        this.top = 0
    }

    // 數(shù)值間的相互轉(zhuǎn)換 
    // 利用棧將一個數(shù)字從一種數(shù)值轉(zhuǎn)換成另一種數(shù)值措近。假設(shè)想將數(shù)組n轉(zhuǎn)換為以b為基數(shù)的數(shù)字溶弟,實(shí)現(xiàn)的轉(zhuǎn)換算法如下:
    // 1. 最高位為n%b,將此位壓入棧
    // 2. 使用n/b代替n 
    // 3. 重復(fù)步驟1和1,直到n等于0瞭郑,且沒有余數(shù)
    // 4. 持續(xù)將棧內(nèi)元素彈出勺美,直到棧為空,依次將這些元素排列稿械,就得到轉(zhuǎn)換后數(shù)字的字符串形式
    // 此算法只針對基數(shù)為2~9的情況 

    function mulBase(num, base) {
        var s = new Stack();
        do {
            s.push(num % base)
            num = Math.floor( num/ base)
        } while (num > 0)

        var converted = ''
        while (s.length() > 0) {
            converted += s.pop()
        }

        return converted 
    }

    // 測試用例
    // var num = 32;
    // var base = 2

    // var newNum = mulBase(num, base)
    // console.log(newNum)


    // 利用stack類拙已,判斷給定字符串是否是回文的程序
    function isPalindrome(word) {
        var s = new Stack()
        for(var i = word.length - 1; i >= 0; i--) {
            s.push(word[i])
        }
        var rword = ''
        while (s.length() > 0) {
            rword += s.pop()
        }
        console.log(word)
        console.log(rword)
    }

    // 測試用例
    // isPalindrome('hello')

    // 普通遞歸
    function factorial(n) {
        if (n === 0) {
            return 1
        } else {
            return n * factorial(n - 1)
        }
    }

    // 測試用例
    // console.log(factorial(5))

    // 用棧來模擬遞歸
    function fact(n) {
        var s = new Stack()
        while(n > 1) {
            s.push(n--)
        }

        var product = 1
        while (s.length() > 0) {
            product *= s.pop()
        }

        return product 
    }

    // 思考:用棧來模擬遞歸,將需要遞歸的數(shù)據(jù)存儲在棧里袜茧,再將棧中的元素彈出去做遞歸計算菜拓。
    // 測試用例
    // console.log(fact(5))

    // 1. 棧可以用來判斷一個算術(shù)表達(dá)式中的括號是否匹配笛厦。編寫一個函數(shù)纳鼎,該函數(shù)接受一個算術(shù)表達(dá)式為參數(shù),返回括號缺失的位置裳凸。下面是一個括號不匹配的算術(shù)表達(dá)式的例子:2.3+23/12+(3.14159*0.24

    function isMatch(express) {
        var str = String(express)
        var s = new Stack()

        for(var i = 0; i < str.length; i++) {
            if(str[i] === '(') {
                s.push(i) //  注意 這里存儲的是擴(kuò)號的位置
            } else if (str[i] === ')') {
                s.pop()
            }
        }
        console.log(`在第${s.peek()}個字符是不匹配的括號`)
    }

    // isMatch('2.3+23/12+(3.14159*0.24')


    // 2. 一個算術(shù)表達(dá)式的后綴表達(dá)式形式如下:op1 op2 operator 
    // 使用兩個棧贱鄙,一個用來存儲操作數(shù),另外一個用來存儲操作符姨谷,設(shè)計并實(shí)現(xiàn)一個Javascript函數(shù)逗宁,該函數(shù)可以將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,然后利用棧對該表達(dá)式求值梦湘。



    // 3.現(xiàn)實(shí)生活中棧的一個例子是佩斯糖果盒瞎颗。想象一下你有一盒佩斯糖果件甥,里面塞滿了紅色、黃色和白色的糖果哼拔,但是你不喜歡黃色的糖果引有。使用棧(有可能用到多個棧)寫一段程序,在不改變盒內(nèi)其他糖果疊放順序的基礎(chǔ)上倦逐,將黃色糖果移除譬正。

    //  先取糖果 如果不是黃色就將糖果放到A棧,如果是黃色糖果就將糖果放到B棧檬姥,直到將原棧的長度為0
    // 再將A棧的糖果依次放入到oirgin原棧

    const boxS = new Stack();
    boxS.push('red');
    boxS.push('yellow');
    boxS.push('white');
    boxS.push('white');
    boxS.push('yellow');
    boxS.push('yellow');
    boxS.push('red');
    boxS.push('red');
    boxS.push('white');
    boxS.push('yellow');
    boxS.push('red');

    function Tangguo(sourceStack) {
        var tempStack = new Stack()
        var yellowStack = new Stack()

        while (sourceStack.length() > 0) {
            if(sourceStack.peek() === 'yellow') {
                yellowStack.push(sourceStack.pop()) // 移除黃色糖果

            } else {
                tempStack.push(sourceStack.pop()) // 暫時保留其它顏色糖果
            }
        }

        var newStack = new Stack()
        while (tempStack.length() > 0) {
            newStack.push(tempStack.pop())
        }

        return newStack
    }
    console.log(Tangguo(boxS))
}

中綴表達(dá)式轉(zhuǎn)換后綴表達(dá)式的實(shí)現(xiàn)曾我,不理解,后面還需要思考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穿铆,一起剝皮案震驚了整個濱河市您单,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荞雏,老刑警劉巖虐秦,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凤优,居然都是意外死亡悦陋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門筑辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俺驶,“玉大人,你說我怎么就攤上這事棍辕∧合郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵楚昭,是天一觀的道長栖袋。 經(jīng)常有香客問我,道長抚太,這世上最難降的妖魔是什么塘幅? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮尿贫,結(jié)果婚禮上电媳,老公的妹妹穿的比我還像新娘。我一直安慰自己庆亡,他們只是感情好匾乓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著又谋,像睡著了一般拼缝。 火紅的嫁衣襯著肌膚如雪括享。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天珍促,我揣著相機(jī)與錄音,去河邊找鬼剩愧。 笑死猪叙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仁卷。 我是一名探鬼主播穴翩,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锦积!你這毒婦竟也來了芒帕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丰介,失蹤者是張志新(化名)和其女友劉穎背蟆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哮幢,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡带膀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了橙垢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垛叨。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柜某,靈堂內(nèi)的尸體忽然破棺而出嗽元,到底是詐尸還是另有隱情,我是刑警寧澤喂击,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布剂癌,位于F島的核電站,受9級特大地震影響惭等,放射性物質(zhì)發(fā)生泄漏珍手。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一辞做、第九天 我趴在偏房一處隱蔽的房頂上張望琳要。 院中可真熱鬧,春花似錦秤茅、人聲如沸稚补。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽课幕。三九已至厦坛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乍惊,已是汗流浹背杜秸。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留润绎,地道東北人撬碟。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像莉撇,于是被迫代替她去往敵國和親呢蛤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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