程序猿必修課之?dāng)?shù)據(jù)結(jié)構(gòu)(七)棧2

原文:http://www.reibang.com/p/5728607674e4

你還在為開發(fā)中頻繁切換環(huán)境打包而煩惱嗎唬复?快來試試 Environment Switcher 吧敞咧!使用它可以在app運行時一鍵切換環(huán)境,而且還支持其他貼心小功能休建,有了它媽媽再也不用擔(dān)心頻繁環(huán)境切換了测砂。https://github.com/CodeXiaoMai/EnvironmentSwitcher

上一章:程序猿必修課之?dāng)?shù)據(jù)結(jié)構(gòu)(六)棧1

棧的應(yīng)用——遞歸

斐波那契(Fibonacci)是一個經(jīng)典的遞歸例子。

斐波那契數(shù)列

數(shù)字 1瞧毙,1寄症,2,3释漆,5篮迎,8,13......構(gòu)成一個序列逊笆,它的特點是:前面相鄰兩項之和是后一項的值岂傲。用數(shù)學(xué)函數(shù)來定義是:

斐波那契數(shù)列

用遞歸實現(xiàn)打印出前 40 位的斐波那契數(shù)列數(shù)的代碼如下:

# include<stdio.h>

int Fbi(int);

int main() {
    int i;
    for (i = 0; i < 40; i++) {
        printf("%d ", Fbi(i));
    }
    return 0;
}

int Fbi(int i) {
    if (i == 0)
        return 0;
    if (i == 1)
        return 1;
    /* 函數(shù)調(diào)用自己 */
    return Fbi(i - 1) + Fbi(i -2);
}

函數(shù)調(diào)用自己,可以理解為調(diào)用另一個函數(shù)乃戈,只不過褂痰,這個函數(shù)和自己一樣而已。

遞歸的定義

一個直接或通過一系列的調(diào)用語句間接的調(diào)用自己的函數(shù)症虑,稱為遞歸函數(shù)缩歪。

每個遞歸定義必須至少有一個條件滿足時遞歸不再進(jìn)行,即不再調(diào)用自己而是返回值并退出谍憔。

迭代和遞歸的區(qū)別

迭代使用的是循環(huán)結(jié)構(gòu)匪蝙,遞歸使用的是選擇結(jié)構(gòu)。遞歸能使程序的結(jié)構(gòu)更清晰韵卤、更簡潔骗污、更容易理解崇猫,但是大量的遞歸調(diào)用會耗費大量的時間和內(nèi)存沈条。迭代則不需要反復(fù)調(diào)用函數(shù)和占用額外的內(nèi)存诅炉。所以蜡歹,凡事都有利有弊,我們應(yīng)該視情況選擇合適的方式涕烧。

棧的應(yīng)用——四則運算表達(dá)式求值

后綴(逆波蘭)表示法

對于"9 + (3 -1)X 3 + 10 ÷ 2" 月而,如果要用后綴表示法應(yīng)該是"9 3 1 - 3 * + 1 0 2 / +",這樣的表達(dá)式稱為后綴表達(dá)式议纯,叫后綴的原因在于所有的符號都是在要運算數(shù)字的后面出現(xiàn)父款。

我們把平時所用的標(biāo)準(zhǔn)四則運算表達(dá)式 ,即 9 + ( 3-1 ) X 3 + 10 ÷ 2 叫做中綴表達(dá)式瞻凤,因為所有的運算符號都在兩數(shù)字的中間憨攒。那么如何將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式呢?

中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的規(guī)則是:

從左到右遍歷中綴表達(dá)式的每個數(shù)字和符號阀参,若是數(shù)字就輸出肝集;若是符號,就判斷其與棧頂符號的優(yōu)先級蛛壳,如果是右括號或者優(yōu)先級低于棧頂符號杏瞻,則棧頂元素依次出棧并輸出,再將當(dāng)前符號進(jìn)棧......直到最終輸出后綴表達(dá)式為止衙荐。

按照上面的規(guī)則捞挥,把 9 + ( 3 - 1 ) X 3 + 10 ÷ 2 轉(zhuǎn)換為后綴表達(dá)式

用 temp 表示當(dāng)前輸出過的所有內(nèi)容,用 stack 表示存儲運算符的棧忧吟。

  1. 第一個字符是數(shù)字 9树肃,temp = "9";后面是符號“+”進(jìn)棧瀑罗,stack = "+";
  2. 第三個字符是“(”胸嘴,因為它是左括號雏掠,所以進(jìn)棧,stack = "+ (";
  3. 第四個字符是數(shù)字 3劣像,所以 temp = "9 3"乡话;后面是符號“-”進(jìn)棧,stack = “+ ( -”耳奕;
  4. 第六個字符是數(shù)字 1绑青,所以 temp = "9 3 1";后面是“)”屋群,所以我們要把 stack 中的棧頂符號出棧闸婴,直到“(”出棧為止。因為“(”上面只有一個“-”芍躏,所以輸出“-”邪乍,temp = “9 3 1 -”,stack = "+";
  5. 第八個字符是“X”对竣,此時棧頂符號為“+”庇楞,優(yōu)先級比“X”低,所以“X”進(jìn)棧否纬,stack = “+ *”吕晌;
  6. 第九個字符是數(shù)字 3,所以 temp = “9 3 1 - 3"临燃;
  7. 第十個字符是“+”睛驳,此時棧頂元素為“ * ”比“+”的優(yōu)先級高,所以棧頂元素出棧并輸出(沒有比“+”更低的優(yōu)先級膜廊,所以全部出棧)然后再將“+”入棧乏沸,temp = "9 3 1 - 3 * +",stack = "+"溃论;
  8. 第十一個字符是數(shù)字10屎蜓,temp = "9 3 1 - 3 * + 10",后面是符號“÷”,所以“/"入棧钥勋,stack = "+ /";
  9. 最后一個字符是數(shù)字2炬转,temp = "9 3 1 - 3 * + 10 2";
  10. 因為已經(jīng)到了最后,所以將棧中符號全部出棧并輸出算灸,temp = "9 3 1 - 3 * + 10 2 / +"; stack 為空棧扼劈,結(jié)束。

所以 9 + ( 3 - 1 ) X 3 + 10 ÷ 2 轉(zhuǎn)換為后綴表達(dá)式結(jié)果為 temp 的值"9 3 1 - 3 * + 10 2 / +"菲驴。

后綴表達(dá)式計算方法

規(guī)則:從左到右遍歷表達(dá)式的每個數(shù)字和符號荐吵,遇到數(shù)字就進(jìn)棧,遇到符號就將處于棧頂?shù)膬蓚€數(shù)字出棧進(jìn)行運算;再將運算結(jié)果進(jìn)棧先煎,直到遍歷結(jié)束贼涩。

求后綴表達(dá)式 "9 3 1 - 3 * + 10 2 / +"的值:

用 stack 表示存儲符號的棧。

  1. 因為后綴表達(dá)式的前 3 個字符都是數(shù)字薯蝎,所以“9 3 1”依次進(jìn)棧遥倦,stack = “9 3 1”;
  2. 接下來是“-”占锯,所以將棧頂?shù)摹?”出棧作為“減數(shù)”袒哥,再將“3”出棧作為“被減數(shù)”,計算 3 - 1 = 2消略,再將 2 進(jìn)棧堡称,stack = “9 2”;
  3. 接著是數(shù)字 3 進(jìn)棧艺演,stack = “9 2 3”却紧;
  4. 再接著是“*”,所以將棧頂?shù)摹?”出棧钞艇,再將“2”出棧啄寡,2 * 3 = 6豪硅;將 6 進(jìn)棧哩照,stack = “9 6”;
  5. 后面是“+”懒浮,將棧中6 和 9 出棧并相加得到 15飘弧,將15進(jìn)棧,stack = “15”;
  6. 接著是數(shù)字10 和 2砚著,將它們依次進(jìn)棧次伶,stack = “15 10 2”;
  7. 后面是“/”稽穆,將 2 出棧作為除數(shù)冠王,再將 10 出棧作為被除數(shù),10 / 2 = 5舌镶,將 5 進(jìn)棧柱彻,stack = "15 5";
  8. 最后一個符號是“+”,所以將 15 與 5 相加得到 20餐胀,再將 20 入棧哟楷,stack = “20”;
  9. 此時否灾,已經(jīng)沒有符號了卖擅,所以將棧中的 20 出棧,運算結(jié)果為 20。

總結(jié)

  1. 將中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式惩阶,棧用來存儲運算符號挎狸。
  2. 計算后綴表達(dá)式的結(jié)果,棧用來存儲運算的數(shù)字断楷。

下一章:程序猿必修課之?dāng)?shù)據(jù)結(jié)構(gòu)(八)隊列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伟叛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脐嫂,更是在濱河造成了極大的恐慌统刮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件账千,死亡現(xiàn)場離奇詭異侥蒙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)匀奏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門鞭衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娃善,你說我怎么就攤上這事论衍。” “怎么了聚磺?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵坯台,是天一觀的道長。 經(jīng)常有香客問我瘫寝,道長蜒蕾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任焕阿,我火速辦了婚禮咪啡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暮屡。我一直安慰自己撤摸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布褒纲。 她就那樣靜靜地躺著准夷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪外厂。 梳的紋絲不亂的頭發(fā)上冕象,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音汁蝶,去河邊找鬼渐扮。 笑死论悴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墓律。 我是一名探鬼主播膀估,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耻讽!你這毒婦竟也來了察纯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤针肥,失蹤者是張志新(化名)和其女友劉穎饼记,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慰枕,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡具则,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了具帮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片博肋。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜂厅,靈堂內(nèi)的尸體忽然破棺而出匪凡,到底是詐尸還是另有隱情,我是刑警寧澤掘猿,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布病游,位于F島的核電站,受9級特大地震影響术奖,放射性物質(zhì)發(fā)生泄漏礁遵。R本人自食惡果不足惜轻绞,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一采记、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧政勃,春花似錦唧龄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懒叛,卻和暖如春丸冕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薛窥。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工胖烛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留眼姐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓佩番,卻偏偏與公主長得像众旗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子趟畏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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