原文: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ù)來定義是:
用遞歸實現(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 表示存儲運算符的棧忧吟。
- 第一個字符是數(shù)字 9树肃,temp = "9";后面是符號“+”進(jìn)棧瀑罗,stack = "+";
- 第三個字符是“(”胸嘴,因為它是左括號雏掠,所以進(jìn)棧,stack = "+ (";
- 第四個字符是數(shù)字 3劣像,所以 temp = "9 3"乡话;后面是符號“-”進(jìn)棧,stack = “+ ( -”耳奕;
- 第六個字符是數(shù)字 1绑青,所以 temp = "9 3 1";后面是“)”屋群,所以我們要把 stack 中的棧頂符號出棧闸婴,直到“(”出棧為止。因為“(”上面只有一個“-”芍躏,所以輸出“-”邪乍,temp = “9 3 1 -”,stack = "+";
- 第八個字符是“X”对竣,此時棧頂符號為“+”庇楞,優(yōu)先級比“X”低,所以“X”進(jìn)棧否纬,stack = “+ *”吕晌;
- 第九個字符是數(shù)字 3,所以 temp = “9 3 1 - 3"临燃;
- 第十個字符是“+”睛驳,此時棧頂元素為“ * ”比“+”的優(yōu)先級高,所以棧頂元素出棧并輸出(沒有比“+”更低的優(yōu)先級膜廊,所以全部出棧)然后再將“+”入棧乏沸,temp = "9 3 1 - 3 * +",stack = "+"溃论;
- 第十一個字符是數(shù)字10屎蜓,temp = "9 3 1 - 3 * + 10",后面是符號“÷”,所以“/"入棧钥勋,stack = "+ /";
- 最后一個字符是數(shù)字2炬转,temp = "9 3 1 - 3 * + 10 2";
- 因為已經(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 表示存儲符號的棧。
- 因為后綴表達(dá)式的前 3 個字符都是數(shù)字薯蝎,所以“9 3 1”依次進(jìn)棧遥倦,stack = “9 3 1”;
- 接下來是“-”占锯,所以將棧頂?shù)摹?”出棧作為“減數(shù)”袒哥,再將“3”出棧作為“被減數(shù)”,計算 3 - 1 = 2消略,再將 2 進(jìn)棧堡称,stack = “9 2”;
- 接著是數(shù)字 3 進(jìn)棧艺演,stack = “9 2 3”却紧;
- 再接著是“*”,所以將棧頂?shù)摹?”出棧钞艇,再將“2”出棧啄寡,2 * 3 = 6豪硅;將 6 進(jìn)棧哩照,stack = “9 6”;
- 后面是“+”懒浮,將棧中6 和 9 出棧并相加得到 15飘弧,將15進(jìn)棧,stack = “15”;
- 接著是數(shù)字10 和 2砚著,將它們依次進(jìn)棧次伶,stack = “15 10 2”;
- 后面是“/”稽穆,將 2 出棧作為除數(shù)冠王,再將 10 出棧作為被除數(shù),10 / 2 = 5舌镶,將 5 進(jìn)棧柱彻,stack = "15 5";
- 最后一個符號是“+”,所以將 15 與 5 相加得到 20餐胀,再將 20 入棧哟楷,stack = “20”;
- 此時否灾,已經(jīng)沒有符號了卖擅,所以將棧中的 20 出棧,運算結(jié)果為 20。
總結(jié)
- 將中綴表達(dá)式轉(zhuǎn)為后綴表達(dá)式惩阶,棧用來存儲運算符號挎狸。
- 計算后綴表達(dá)式的結(jié)果,棧用來存儲運算的數(shù)字断楷。