国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊一聊算法之旅:棧

大數據 數據分析 算法
本質棧是一種特殊的數據結構,它特殊在它的結構,與數組、鏈表不同的是,它的數據出入規則是:先進后出,后進先出。

[[379190]]

本質棧是一種特殊的數據結構,它特殊在它的結構,與數組、鏈表不同的是,它的數據出入規則是:先進后出,后進先出。

由于它這種特殊的特性,它一般用于指定的場景之下,例如:瀏覽器的前進與回退效果。

瀏覽器的特性是:我們可以向前訪問我們之前訪問的網站,也可以向后訪問后面的網站。

瀏覽器的這種特性,完美匹配了棧的結構。

我們只需使用兩個棧,分別代表瀏覽器的向前訪問與向后訪問。

 

當某個數據集合只涉及在一端插入和刪除數據,并且滿足先進后出,后進先出的特性,這時我們應該首先想到的是棧,看它是否能夠更好的實現我們所需的場景。

實現方式棧的實現方式有兩種,一種是基于數組的實現方式,稱為順序棧;另一種是基于鏈表的實現方式,稱為鏈式棧。

這兩種實現方式區別不是很多,實現之后棧的出入時間復雜度都是O(1)。

不同的是基于數組實現的棧消耗的內存更少,因為它不需要額外保存指向的指針。

但基于數組的另外一額外需要做的是,如果需要實現不定大小的棧,它需要實現動態擴容,這是所有基于數組實現的一個必修課。

下面我們來實現一個基于數組的順序棧,為了減少復雜度,不考慮擴容的情況。

// 基于數組實現的順序棧class ArrayStack(private val n: Int) { private val items = arrayOfNulls(n) // 棧數組 private var count = 0 // 棧的當前大小 // 入棧 fun push(item: String): Boolean { // 數組空間不夠了,直接返回false,入棧失敗 if (count == n) return false // 將item放到下標為count的位置,并且count加一 items[count] = item ++count return true } // 出棧 fun pop(): String? { // 棧為空,則直接返回null if (count == 0) return null // 返回下標為count-1的數組元素,并且棧中元素個數count減一 val tmp = items[count - 1] --count return tmp }}

基于上面的實現,我們能夠很容易得出棧的出入時間復雜度為O(1)。

另一方面,由于沒有額外的空間申請,所以棧的空間復雜度為O(1)。

擴容上面我們實現的是一個固定的順序棧,也就是說初始化的時候已經指定了棧的大小,當棧滿了的時候,無法進行向棧中添加數據。當然基于鏈表的鏈式棧沒有這種限制。

為了解決順序棧的這種限制,我們需要對數據進行擴容操作,這在數組那一節也有提及過。

所以,如果要實現一個支持擴容的棧,我們只需底層依賴一個基于擴容的數組即可。

具體的擴容示意圖如下:

 

具體代碼實現可以查看數據的擴容。

下面我們再來分析一下基于數組擴容的棧的時間復雜度。

首先未達到棧的大小時,這一階段與固定的順序棧一樣,出入的時間復雜度都為O(1)。

當數據為K時且達到擴容的臨界點時,需要將數組的大小擴大到原來的兩倍,并將之前的數據拷貝的新的數組中;這一階段消耗的時間復雜度為O(K)。

當擴容結束之后繼續出入棧,此時的時間復雜度又為O(1)。

當再一次達到2k時又需要再次擴容,拷貝數據到新數組中,此時消耗的時間復雜度為O(2k)。

反復重復以上步驟。

這就是支持擴容的順序棧的時間復雜度的變化。也就是說最好情況的時間復雜度為O(1);最壞的時間復雜度為O(n)。那么平均時間復雜度呢?

還記得在算法之旅:復雜度分析中提到的均攤時間復雜度嗎?

下面我們就利用均攤時間復雜度來分析它的平均時間復雜度。其實看一張圖就能夠明白均攤時間復雜度的算法。

 

每次我們都將擴容的所消耗的時間都分攤到之后的入棧中。在分攤之前入棧需要一個push的時間;分攤之后入棧在push的時間上再加上一個數據move的時間。push與move的時間復雜度都為O(1)。

所以均攤之后棧的整個時間復雜度就是O(1),即棧的平均復雜度為O(1)。

棧的應用現在我們已經對棧有了一個全面的了解,為了完全鞏固棧這種數據結構,我們剩下的就是練習以達到熟悉程度。

例如:實現一個基本的計算器來計算一個簡單的字符串表達式的值, 字符串表達式可以包含左括號(,右括號),加號+,減號-,非負整數和空格。

基于表達式的運算,非常符合棧這種結構,我們可以使用棧來實現的。實現思路如下:

通過設定一個符號位將所有的運算轉化成加法

遇到數字都帶上之前的符號位,再與之前的結果做加法運算

遇到'('將之前的符號位與結果保留到棧中,然后再重復1 2步驟計算括號里面的值

遇到')'取出之前保留的符號位與結果,與當前結果做加法運算

/** * O(n) */fun calculate(s: String): Int { val numberStack = Stack() var sign = 1 // 符號位 var result = 0 var index = 0 while (index < s.length) { when (s[index]) { '+' -> { sign = 1 } '-' -> { sign = -1 } '(' -> { // 將當前結果加入棧中 numberStack.push(result) result = 0 // 將當前符號位加入棧中 numberStack.push(sign) sign = 1 } ')' -> { // 取出之前保留的符號位與結果,與當前結果做加法運算 result = numberStack.pop() * result + numberStack.pop() } ' ' -> { } else -> { // 計算出當前的數值,可以能為多位數 var cur = s[index] - '0' while (index + 1 < s.length && s[index + 1].isDigit()) { cur = cur * 10 + (s[++index] - '0') } // 遇到數字帶上之前的符號位,再與之前的結果做加法運算 result += cur * sign } } index++ } return result}

還有一些關于棧的經典練習,如果能夠掌握這些,那么有關棧的算法就基本沒什么問題了

比較含退格的字符串

棒球比賽

下一個更大元素

有效的括號

 

我將源碼放在Github上了,如有需要的可以自行查看。

本文轉載自微信公眾號「 Android補給站」,可以通過以下二維碼關注。轉載本文請聯系 Android補給站公眾號。

 

責任編輯:武曉燕 來源: Android補給站
相關推薦

2023-09-20 23:01:03

Twitter算法

2020-05-09 14:20:11

信息安全加密

2018-06-07 13:17:12

契約測試單元測試API測試

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2021-01-28 22:31:33

分組密碼算法

2020-08-12 08:34:16

開發安全We

2022-10-08 11:33:56

邊緣計算云計算

2020-06-28 09:30:37

Linux內存操作系統

2021-01-01 09:01:05

前端組件化設計

2020-09-08 06:54:29

Java Gradle語言

2019-12-17 10:06:18

CDMA高通4G

2022-03-29 09:56:21

游戲版本運營

2022-03-08 16:10:38

Redis事務機制

2018-01-10 14:13:04

測試矩陣API測試

2022-11-26 00:00:06

裝飾者模式Component

2023-12-12 07:13:39

雪花算法分布式ID

2024-09-12 10:06:21

2022-11-01 08:46:20

責任鏈模式對象

2019-02-13 14:15:59

Linux版本Fedora
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品视频| 日韩精品极品视频免费观看| 激情伦成人综合小说| 国产亚洲精彩久久| 亚洲成人黄色影院| 日韩激情视频一区二区| 欧美福利影院| 5252色成人免费视频| 最近在线中文字幕| 在线日韩av片| 黄色成人av| 久久婷婷一区二区三区| 一区二区三区久久网| 亚洲激情中文| 97超级碰碰人国产在线观看| 欧美特黄aaaaaaaa大片| 欧美精品一卡二卡| 一级片免费在线观看| 中文字幕在线播放不卡一区| 久久99中文字幕| 精品无码三级在线观看视频| 九九九久久久| 91精品国产乱码久久久久久| 国内精品视频久久| 国产精品一区二区免费福利视频 | 夜久久久久久| 国产精品偷伦视频免费观看国产| 亚洲高清影院| 这里只有精品视频| 老司机深夜福利在线观看| 欧美视频一区二区三区在线观看 | 国产亚洲欧洲黄色| 欧美xxxx免费虐| 91精品婷婷国产综合久久竹菊| 欧美高清电影在线| 亚欧色一区w666天堂| 蜜桃视频免费网站| 亚洲欧洲另类国产综合| 色噜噜狠狠永久免费| 国产日韩精品一区| 日本在线观看a| eeuss影院一区二区三区| 久久av秘一区二区三区| 日本女人一区二区三区| 亚洲精品日韩成人| 久久 天天综合| 91精品国产毛片武则天| 国产成人综合亚洲网站| bt天堂新版中文在线地址| 国产不卡视频在线观看| 91九色丨porny丨国产jk| 成人高清免费观看| 日韩欧美黄色大片| 国产亚洲短视频| 7878视频在线观看| 婷婷中文字幕综合| 91精彩视频在线观看| 欧美大片一区二区| 成人精品国产亚洲| 韩国v欧美v日本v亚洲| 精品国产精品| 91原创国产| 天使萌一区二区三区免费观看| 亚洲视频欧美在线| xfplay精品久久| 日本韩国福利视频| 欧美人体做爰大胆视频| av资源网在线播放| 日韩在线观看免费| 天堂俺去俺来也www久久婷婷 | 中文字幕在线免费观看视频| 一区二区三区在线播放欧美| 91欧美极品| 亚洲综合精品一区二区| 免费视频一区二区| 亚洲精品乱码久久久久久自慰| 亚洲欧美日韩国产综合在线 | 91首页免费视频| 福利电影导航| 欧美日韩大陆在线| 国产91欧美| 国产成人欧美在线观看| 亚洲一区二区毛片| jizzjizz国产精品喷水| 婷婷一区二区三区| 欧产日产国产精品视频| 国产成人精品一区二区在线| 午夜影院日韩| 亚洲综合婷婷久久| 制服丝袜日韩国产| 哺乳挤奶一区二区三区免费看| 国产精品国产精品国产专区不卡| 国产成人午夜视频| 亚洲色图16p| 亚洲天堂第二页| 99成人超碰| 欧美一区二区视频在线播放| 亚洲午夜一区二区| 欧洲av一区二区| 91亚洲va在线va天堂va国| 久久国产人妖系列| 三上悠亚一区二区三区| 亚洲成人xxx| 欧美日韩在线二区| 少妇人妻在线视频| 91精品国产综合久久国产大片| 超碰国产精品一区二页| 国产福利久久精品| 中文字幕不卡的av| 女人高潮被爽到呻吟在线观看| 国产精品久久91| 成人av网站大全| 成人亚洲综合天堂| 欧美综合激情网| 国产99精品国产| caoporn免费在线视频| 国产精品第一视频| 91蜜桃在线观看| 97久久人人超碰caoprom| 成人日韩在线电影| 亚洲欧洲色图综合| 成人永久在线| 亚洲最新免费视频| 91精品国产免费久久综合| 999久久久亚洲| 亚洲综合欧美激情| 亚洲美女性视频| 日产国产高清一区二区三区| 欧洲一区av| 热久久免费视频精品| 不卡av免费在线观看| heyzo一区| 美日韩免费视频| 欧美性猛交99久久久久99按摩| 欧美亚洲大陆| 天天操天天摸天天爽| 夜夜嗨av一区二区三区四区| 日韩有码一区二区三区| 一本一道波多野毛片中文在线| 国产精品午夜一区二区欲梦| 国产精品久久久久影院| 美女精品视频在线| 只有这里有精品| 亚洲精品美女在线观看| 久久av在线| 国产福利在线播放麻豆| 黑人巨大精品欧美一区二区小视频 | 97福利一区二区| 成人网在线播放| 成人三级小说| 欧美亚洲爱爱另类综合| 欧美美女喷水视频| 欧美午夜精品| 国产资源在线看| 古典武侠综合av第一页| 一本久久综合亚洲鲁鲁五月天| 成人在线国产| 亚洲色图16p| 国产精品日韩欧美一区二区| 欧美日韩一级二级| 亚洲一区国产一区| 色操视频在线| 欧美尤物一区| 亚洲国产精品人人爽夜夜爽| 久久99久久精品欧美| 五月天av在线| 国产中文字幕二区| 久久人人看视频| 亚洲综合另类小说| 一区二区三区四区电影| www.av在线| 天堂√在线观看一区二区| 亚洲黄色在线观看| kk眼镜猥琐国模调教系列一区二区 | 欧美日韩国产成人高清视频| 91免费精品国自产拍在线不卡| 中文字幕视频精品一区二区三区| youjizzxxxx18| 国产成人av网| 色噜噜偷拍精品综合在线| 亚洲综合丁香| 韩日精品一区| 琪琪五月天综合婷婷| 国产综合香蕉五月婷在线| 欧美蜜桃一区二区三区| 国内精品写真在线观看| 影音先锋欧美激情| 污污网站在线| 一区二区三区久久网| 欧美高跟鞋交xxxxxhd| 午夜免费久久看| 亚洲免费激情| 91综合国产| 91短视频在线观看| 日韩av在线电影观看| 日韩一区二区欧美| 精品成人久久av| 久久成人久久爱| 希岛爱理av免费一区二区| 色哟哟免费在线观看|