數(shù)據(jù)結(jié)構(gòu)與算法-棧

什么是棧营密?

是一種受限的線性表械媒,只允許在一端進行元素的插入和刪除操作,進棧和出棧遵循先進后出后進先出的規(guī)則。

為什么要用這種受限的數(shù)據(jù)結(jié)構(gòu)纷捞,用數(shù)組和鏈表難道不好嗎痢虹?受限的數(shù)據(jù)結(jié)構(gòu)是用在特定的場景中,數(shù)組和鏈表的操作是很靈活主儡,但是很容易出錯奖唯。

當(dāng)然,數(shù)組和鏈表都可以實現(xiàn)這種數(shù)據(jù)結(jié)構(gòu)糜值,用數(shù)組實現(xiàn)的稱為順序棧丰捷,用鏈表實現(xiàn)的稱為鏈?zhǔn)綏?/strong>。相較于數(shù)組寂汇,鏈表的每個元素需要多存儲指針域數(shù)據(jù)瓢阴,對內(nèi)存的消耗更大。
下面說一下進棧和出棧的具體實現(xiàn)過程健无。首先用構(gòu)造一個大小為 4 的棧,依次將 a液斜、b累贤、c、d 壓入棧中少漆,過程如圖所示臼膏。

進棧操作.jpg

在元素出棧時,依次將棧頂元素取出示损,即 d渗磅、c、b检访、a 依次出棧始鱼。


棧的時間、空間復(fù)雜度

看一下棧的空間復(fù)雜度脆贵,一個棧需要 n 個存儲單元(固定不變的)医清,每次只操作棧頂一個元素,所以空間復(fù)雜度是 O(1)卖氨。

看一下棧的時間復(fù)雜度会烙,出棧時,不論棧滿還是棧未滿筒捺,不涉及內(nèi)存的申請柏腻,時間復(fù)雜度都為 O(1),對于出棧系吭,分為兩種情況:

  • 棧未滿是元素進棧五嫂。
  • 棧滿時元素進棧。

第一種情況村斟,可以直接將元素壓入棧中贫导,時間復(fù)雜度是 O(1) 抛猫。第二種情況略微復(fù)雜一些,需要再申請一塊更大的內(nèi)存空間孩灯,將棧中 n 個元素拷貝到新的內(nèi)存空間中闺金,再進行入棧操作。這樣峰档,時間復(fù)雜度就變成了 O(n)败匹。所以,對于入棧操作讥巡,最好時間復(fù)雜度是 O(1)掀亩,最壞時間復(fù)雜度是 O(n)。

然后再計算一下平均時間復(fù)雜度欢顷,利用之前學(xué)習(xí)的攤還分析法來分析槽棍,下面先做幾個假設(shè):

  • 棧滿時,重新申請一個大小為原來兩倍的內(nèi)存空間抬驴。
  • 只有入棧炼七,沒有出棧操作。
  • 定義不涉及內(nèi)存搬移的操作為 simple-push 操作布持,時間復(fù)雜度為 O(1)

將 n 個數(shù)據(jù)搬移到新的內(nèi)存空間中豌拙,需要 n 次操作,接下來的 n 次進棧操作不再需要數(shù)據(jù)的遷移题暖,是需要一次 simple-push 操作按傅。將 n 次數(shù)據(jù)搬移操作均攤到接下來的 n 次進棧操作中,相當(dāng)于每次進棧操作有一次數(shù)據(jù)搬移操作和一次 simple-push 操作胧卤,所以平均時間復(fù)雜為 O(1)唯绍。

棧的應(yīng)用

函數(shù)的調(diào)用

在函數(shù)調(diào)用時,第一個進棧的是主函數(shù)中函數(shù)調(diào)用后的下一條指令(函數(shù)調(diào)用語句的下一條可執(zhí)行語句)的地址灌侣,然后是函數(shù)的各個參數(shù)推捐,在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧的侧啼,然后是函數(shù)中的局部變量牛柒。注意靜態(tài)變量是不入棧的。

當(dāng)本次函數(shù)調(diào)用結(jié)束后痊乾,局部變量先出棧皮壁,然后是參數(shù),最后棧頂指針指向最開始存的地址哪审,也就是主函數(shù)中的下一條指令蛾魄,程序由該點繼續(xù)運行。(轉(zhuǎn)自https://blog.csdn.net/wangyezi19930928/article/details/16921927?utm_source=copy

括號的匹配

例如 '{ [ ] }'中的括號匹配,將 ‘{’ 壓入棧中滴须,‘[’ 和棧中元素匹配舌狗,發(fā)現(xiàn)匹配不成功,'[' 也壓入棧中扔水,']' 發(fā)現(xiàn)棧中有能匹配的括號 '['痛侍,'[' 出棧,同理魔市,'}' 發(fā)現(xiàn)棧中有能匹配的括號 '{'主届,此時,沒有要匹配的括號元素待德,且棧為空君丁,則說明沒有不能配對的括號。

瀏覽器頁面的前進和后退

瀏覽器一般都有前進和后退瀏覽網(wǎng)頁的功能将宪,這個功能可以用兩個棧來實現(xiàn)绘闷。

現(xiàn)在有兩個棧,分別為棧 A 和棧 B较坛,沒瀏覽一個新的網(wǎng)頁簸喂,就將網(wǎng)頁壓入 A 中,現(xiàn)在 A 中存儲了 a燎潮、b、c扼倘、d 四個網(wǎng)頁确封,當(dāng)點擊后退按鈕時,d 從 A 出棧再菊,并且壓入 B 中爪喘,再點擊一次后退按鈕,c 從 A 出棧纠拔,并且壓入 B 中秉剑,直到 a 從 A 出棧,壓入 B 中稠诲,棧 A 為空侦鹏,就無法后退,具體操作如圖所示臀叙。


網(wǎng)頁后退操作.jpg

點擊前進按鈕略水,a 從 B 中出棧,壓入 A 中劝萤,操作與后退是進出棧相同渊涝。


小結(jié)

棧的操作比較簡單,一般用在特定的情況下,棧的應(yīng)用也比較廣泛跨释,很多應(yīng)用沒有一一列出來胸私,函數(shù)調(diào)用為什么要用棧這種數(shù)據(jù)結(jié)構(gòu),還需要再研究一下鳖谈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岁疼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚯姆,更是在濱河造成了極大的恐慌五续,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龄恋,死亡現(xiàn)場離奇詭異疙驾,居然都是意外死亡,警方通過查閱死者的電腦和手機郭毕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門它碎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人显押,你說我怎么就攤上這事扳肛。” “怎么了乘碑?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵挖息,是天一觀的道長。 經(jīng)常有香客問我兽肤,道長套腹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任资铡,我火速辦了婚禮电禀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笤休。我一直安慰自己尖飞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布店雅。 她就那樣靜靜地躺著政基,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闹啦。 梳的紋絲不亂的頭發(fā)上腋么,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音亥揖,去河邊找鬼珊擂。 笑死圣勒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摧扇。 我是一名探鬼主播圣贸,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扛稽!你這毒婦竟也來了吁峻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤在张,失蹤者是張志新(化名)和其女友劉穎用含,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帮匾,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡啄骇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘟斜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缸夹。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖螺句,靈堂內(nèi)的尸體忽然破棺而出虽惭,到底是詐尸還是另有隱情,我是刑警寧澤蛇尚,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布芽唇,位于F島的核電站,受9級特大地震影響取劫,放射性物質(zhì)發(fā)生泄漏披摄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一勇凭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧义辕,春花似錦虾标、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至基显,卻和暖如春蘸吓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撩幽。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工库继, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箩艺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓宪萄,卻偏偏與公主長得像艺谆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拜英,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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