日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈是什么意思?怎样实现一个栈?

發布時間:2024/1/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈是什么意思?怎样实现一个栈? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何理解“棧”?

關于“棧”,我有一個非常貼切的例子,就是一摞疊在一起的盤子。我們平時放盤子的時候,都是從下往上一個一個放;取的時候,我們也是從上往下一個一個地依次取,不能從中間任意抽出。后進者先出,先進者后出,這就是典型的“棧”結構。
?


從棧的操作特性上來看,棧是一種“操作受限”的線性表,只允許在一端插入和刪除數據

我第一次接觸這種數據結構的時候,就對它存在的意義產生了很大的疑惑。因為我覺得,相比數組和鏈表,棧帶給我的只有限制,并沒有任何優勢。那我直接使用數組或者鏈表不就好了嗎?為什么還要用這個“操作受限”的“棧”呢?

事實上,從功能上來說,數組或鏈表確實可以替代棧,但你要知道,特定的數據結構是對特定場景的抽象,而且,數組或鏈表暴露了太多的操作接口,操作上的確靈活自由,但使用時就比較不可控,自然也就更容易出錯。

當某個數據集合只涉及在一端插入和刪除數據,并且滿足后進先出、先進后出的特性,我們就應該首選“棧”這種數據結構。
?

支持動態擴容的順序棧

如果要實現一個支持動態擴容的棧,我們只需要底層依賴一個支持動態擴容的數組就可以了。當棧滿了之后,我們就申請一個更大的數組,將原來的數據搬移到新數組中。

實際上,支持動態擴容的順序棧,我們平時開發中并不常用到。

入棧、出棧的時間復雜度:

對于出棧操作來說,我們不會涉及內存的重新申請和數據的搬移,所以出棧的時間復雜度仍然是 O(1)。但是,對于入棧操作來說,情況就不一樣了。當棧中有空閑空間時,入棧操作的時間復雜度為 O(1)。但當空間不夠時,就需要重新申請內存和數據搬移,所以時間復雜度就變成了 O(n)。

也就是說,對于入棧操作來說,最好情況時間復雜度是 O(1),最壞情況時間復雜度是 O(n)。那平均情況下的時間復雜度又是多少呢?

如果當前棧大小為 K,并且已滿,當再有新的數據要入棧時,就需要重新申請 2 倍大小的內存,并且做 K 個數據的搬移操作,然后再入棧。但是,接下來的 K-1 次入棧操作,我們都不需要再重新申請內存和搬移數據,所以這 K-1 次入棧操作都只需要一個 simple-push 操作就可以完成。

你應該可以看出來,這 K 次入棧操作,總共涉及了 K 個數據的搬移,以及 K 次 simple-push 操作。將 K 個數據搬移均攤到 K 次入棧操作,那每個入棧操作只需要一個數據搬移和一個 simple-push 操作。以此類推,入棧操作的均攤時間復雜度就為 O(1)。

通過這個例子的實戰分析,也印證了前面講到的,均攤時間復雜度一般都等于最好情況時間復雜度。因為在大部分情況下,入棧操作的時間復雜度 O 都是 O(1),只有在個別時刻才會退化為 O(n),所以把耗時多的入棧操作的時間均攤到其他入棧操作上,平均情況下的耗時就接近 O(1)。
?

棧在括號匹配中的應用

我們可以借助棧來檢查表達式中的括號是否匹配。

我們同樣簡化一下背景。我們假設表達式中只包含三種括號,圓括號 ()、方括號[]和花括號{},并且它們可以任意嵌套。比如,{[] ()[{}]}或[{()}([])]等都為合法格式,而{[}()]或[({)]為不合法的格式。那我現在給你一個包含三種括號的表達式字符串,如何檢查它是否合法呢?

這里也可以用棧來解決。我們用棧來保存未匹配的左括號,從左到右依次掃描字符串。當掃描到左括號時,則將其壓入棧中;當掃描到右括號時,從棧頂取出一個左括號。如果能夠匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,則繼續掃描剩下的字符串。如果掃描的過程中,遇到不能配對的右括號,或者棧中沒有數據,則說明為非法格式。

當所有的括號都掃描完成之后,如果棧為空,則說明字符串為合法格式;否則,說明有未匹配的左括號,為非法格式。

如何實現一個“棧”?

從剛才棧的定義里,我們可以看出,棧主要包含兩個操作,入棧和出棧,也就是在棧頂插入一個數據和從棧頂刪除一個數據。理解了棧的定義之后,我們來看一看如何用代碼實現一個棧。

實際上,棧既可以用數組來實現,也可以用鏈表來實現。用數組實現的棧,我們叫作順序棧,用鏈表實現的棧,我們叫作鏈式棧。

不管是順序棧還是鏈式棧,我們存儲數據只需要一個大小為 n 的數組就夠了。在入棧和出棧過程中,只需要一兩個臨時變量存儲空間,所以空間復雜度是 O(1)。

注意,這里存儲數據需要一個大小為 n 的數組,并不是說空間復雜度就是 O(n)。因為,這 n 個空間是必須的,無法省掉。所以我們說空間復雜度的時候,是指除了原本的數據存儲空間外,算法運行還需要額外的存儲空間。

空間復雜度分析是不是很簡單?時間復雜度也不難。不管是順序棧還是鏈式棧,入棧、出棧只涉及棧頂個別數據的操作,所以時間復雜度都是 O(1)。

在Python中,我們可以通過數組或者鏈表的方式來實現棧,接下來先來看一下通過數組的方式來實現棧:

class Stack:def __init__(self):self.items = []def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[-1]def is_empty(self):return len(self.items) == 0def size(self):return len(self.items)

  這個示例代碼實現了一個棧類。它包括以下方法:

  ·__init__:創建一個空的棧。

  ·push:向棧中添加元素。

  ·pop:從棧中彈出元素,并將其返回。

  ·peek:返回棧頂元素,但不彈出它。

  ·is_empty:判斷棧是否為空。

  ·size:返回棧中元素的數量。

  下面是使用鏈表的方式來實現棧:

class Node:def __init__(self, data=None, next=None):self.data = dataself.next = nextclass Stack:def __init__(self):self.head = Nonedef push(self, data):new_node = Node(data)new_node.next = self.headself.head = new_nodedef pop(self):if self.head is None:return Nonepopped = self.head.dataself.head = self.head.nextreturn poppeddef peek(self):if self.head is None:return Nonereturn self.head.datadef is_empty(self):return self.head is Nonedef size(self):count = 0node = self.headwhile node:count += 1node = node.nextreturn count

  這個示例代碼也實現了一個棧類,它是通過鏈表來實現棧。它包括以下方法:

  ·__init__:創建一個空的棧。

  ·push:向棧中添加元素。

  ·pop:從棧中彈出元素,并將其返回。

  ·peek:返回棧頂元素,但不彈出它。

  ·is_empty:判斷棧是否為空。

  ·size:返回棧中元素的數量。

  這兩個實現方法的主要區別在于底層數據結構的不同,數組實現更容易理解,但在某些情況下可能會導致性能問題,而鏈表實現則更靈活,但在一些情況下可能會稍微復雜一些。

?

總結

以上是生活随笔為你收集整理的栈是什么意思?怎样实现一个栈?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线免费看91 | 久久久青 | 97伊人| 鲁鲁久久 | h片在线观看视频 | 国产成人a亚洲精v品无码 | 久久综合伊人77777蜜臀 | 欧美福利片在线观看 | 国产视频在线观看视频 | 黄色69| 日韩一区二区免费播放 | 欧美色88| av成人在线电影 | 久久亚洲无码视频 | 天天操妹子 | 久久久久久久久久影院 | 亚洲久操 | 欧美在线观看视频一区二区 | www.毛片.com | 97一区二区三区 | 九七伦理电影 | 制服.丝袜.亚洲.中文.综合 | 黄色片在线免费观看 | 国产理论av| 精品一区二区三区入口 | 日韩丝袜一区 | 无码国产精品一区二区高潮 | 日韩小视频在线 | 91pao| 中文字幕婷婷 | 国产日韩欧美在线观看视频 | 欧美日韩另类视频 | 国产黄色在线看 | 成人高清视频在线观看 | 吃瓜网今日吃瓜 热门大瓜 色婷在线 | 精品人妻一区二区三区四区五区 | 97精品国产97久久久久久免费 | 亚洲精品乱码久久久久久9色 | aaa日韩 | 求一个黄色网址 | 中文一区二区在线观看 | 午夜精品99 | 天堂婷婷| av合集 | 捆绑无遮挡打光屁股 | 樱桃视频一区二区三区 | 国产又粗又猛又爽又黄的视频小说 | 色狠狠久久av大岛优香 | 免费高清视频一区二区三区 | 九九天堂网 | 日批网址 | 成人在线免费播放视频 | 国产特级毛片aaaaaa | 人妻精品无码一区二区三区 | 国产午夜精品在线观看 | 欧美91成人网 | 超碰av在线播放 | 欧美丰满美乳xxx高潮www | 亚洲成人麻豆 | 三级av片 | 手机在线观看av片 | 亚洲精品偷拍视频 | 欧美高清精品 | 捆绑中国女人hd视频 | 国产伦精品一区 | 五月天激情在线 | 国产麻豆剧传媒精品国产av | 成人午夜精品无码区 | 亚洲天堂色| 秋霞在线观看秋 | 久久久久久久久亚洲 | 美女自拍偷拍 | 国产精品激情 | 欧美妞干网 | 亚洲男人av | 四虎黄色影院 | 亚洲码国产精品高潮在线 | 好姑娘在线观看高清完整版电影 | 亚洲在线色 | 亚洲日本精品视频 | 亚洲一卡二卡三卡四卡 | 美女喷液视频 | 亚洲欧美日韩天堂 | 在线视频黄| 久久精品国产亚洲AV黑人 | 国产 日韩 欧美 精品 | 亚洲在线观看一区二区 | 公侵犯人妻一区二区 | 爱爱免费小视频 | xvideos永久免费入口 | 国产精品久久久久久亚洲毛片 | 中文字幕乱码人妻无码久久95 | 国产在线观看第一页 | 少妇喷白浆| 欧洲女女同videos | 天天射天天干天天操 | 国产成人99久久亚洲综合精品 | 丰满少妇被猛烈进入高清播放 | 国产成人精品777777 |