欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解(1)

 更新時間:2022年03月09日 16:51:42   作者:姜學(xué)遷  
這篇文章主要為大家詳細介紹了Python中的棧,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

什么是棧

有時也被稱作“下推棧”。它是有序集合,添加操作和移除操作總發(fā)生在同一端,即棧的 “頂端”,棧的另一端則被稱為 “底端”。所以最新添加的元素將被最先移除,而且棧中的元素離底端越近,代表其在棧中的時間越長。

這種排序原則被稱作LIFO(last-in first-out),即后進先出。它提供了一種基于在集合中的時間來排序的方式。 最近添加的元素靠近頂端,舊元素則靠近底端。

棧的例子在日常生活中比比皆是。幾乎所有咖啡館都有一個由托盤或盤子構(gòu)成的棧,你可以從頂部取走一個,下一 個顧客則會取走下面的托盤或盤子。

考慮到棧的反轉(zhuǎn)特性,我們可以想到在使用計算機時的一些例子。例如,每一個瀏覽器都有返回按鈕。當(dāng)我們從一個網(wǎng)頁跳轉(zhuǎn)到另一個網(wǎng)頁時,這些網(wǎng)頁——實際上是URL,都被存放在一個棧中。當(dāng)前正在瀏覽的網(wǎng)頁位于棧的頂端,最早瀏覽的網(wǎng)頁則位于底端。如果點擊返回按鈕, 便開始反向瀏覽這些網(wǎng)頁。

構(gòu)建一個棧

如前所述,棧是元素的有序集合,添加操作與移除操作都發(fā)生在其頂端。棧的操作順序是LIFO,它支持以下操作:

  • 將一個元素添加到棧的頂端
  • 將棧頂端的元素移除
  • 返回棧頂端的元素
  • 返回棧中元素的數(shù)目

明確了棧的基本特性之后,我們開始用代碼構(gòu)建它。在面向?qū)ο蟮木幊陶Z言中(以Python為例),每當(dāng)需要在Python中實現(xiàn)像棧這樣的抽象數(shù)據(jù)類型時 ,就可以通過創(chuàng)建一個類的途徑實現(xiàn)它,且數(shù)據(jù)類型的特性、操作方法等也可以通過在類中定義方法實現(xiàn)。

我們來明確一下這個類的具體方法:

  • 創(chuàng)建一個空棧。它不需要參數(shù),且會返回一個空棧。 Stack()
  • 將一個元素添加到棧的頂端。它需要一 個參數(shù)item ,且無返回值。 push(item)
  • 將棧頂端的元素移除。它不需要參數(shù),但會返回頂端的元素,并且修改棧的內(nèi)容。 pop()
  • 返回棧頂端的元素,但是并不移除該元素。 它不需要參數(shù),也不會修改棧的內(nèi)容。 peek()
  • 返回棧中元素的數(shù)目。它不需要參數(shù),且會返回一個整數(shù)。 size()
  • 檢查棧是否為空。它不需要參數(shù),且會返回一個布爾值。 isEmpty()
  • 打印這個棧/列表,它不需要參數(shù),會輸出棧的內(nèi)容。 look()

?因為棧是元素的集合,所以完全可以利用Python提供的強大、簡單的原生集合來實現(xiàn)。這里,我們將使用列表。 列表的最左端將用來表示棧底,最右邊將用來表示棧頂:

class Stack:
  # 定義一個列表/構(gòu)造一個棧
  def __init__(self):
  	self.items = []
  	print("你創(chuàng)造了一個棧!")
  def isEmpty(self):
    return self.items == []
  def look(self):
    print(self.items)
  def push(self, item):
    self.items.append(item)
    print("你給棧頂加了個%s" % item)
  def pop(self):
    return self.items.pop()
  def peek(self):
    return self.items[len(self.items) - 1]
  def size(self):
    return len(self.items)

以下展示了棧的操作及其返回結(jié)果:

在這里插入圖片描述

值得注意的是,也可以選擇將列表的頭部(左邊)作為棧的頂端。 不過在這種情況下,便無法直接使用列表的pop方法和append方法,而必須要用列表的pop方法和insert方法顯式地訪問下標(biāo)為0的元素,即列表中的第1個元素。以下代碼展現(xiàn)了這種方式:

class Stack:
  def __init__(self):
  	self.items = []
  def isEmpty(self):
    return self.items == []
  def look(self):
    print(self.items)
  def push(self, item):
    self.items.insert(0, item)
  def pop(self):
    return self.items.pop(0)
  def peek(self):
    return self.items[0]
  def size(self):
    return len(self.items)

盡管上述兩種實現(xiàn)都可行,但是二者在性能方面肯定有差異。append 方法和 pop 方法的時間復(fù)雜度都是 o ( 1 ) o(1) o(1),這意味著不論棧中有多少個元素, 第一種實現(xiàn)中的 push 操作和 pop 操作都會在恒定的時間內(nèi)完成。第二種實現(xiàn)的性能則受制于棧中的元素個數(shù),這 是因為 insert(0) 和 pop(0) 的時間復(fù)雜度都是 o ( n ) o(n) o(n),元素越多就越慢。

顯而易見,盡管兩種實現(xiàn)在邏輯上是相等的,但是它們在進行基準(zhǔn)測試時耗費的時間會有很大的差異。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容! 

相關(guān)文章

  • python自動從arxiv下載paper的示例代碼

    python自動從arxiv下載paper的示例代碼

    這篇文章主要介紹了python自動從arxiv下載paper的示例代碼,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • Python函數(shù)使用的相關(guān)練習(xí)題分享

    Python函數(shù)使用的相關(guān)練習(xí)題分享

    這篇文章主要介紹了Python函數(shù)使用的相關(guān)練習(xí)題分享,文章基于python函數(shù)內(nèi)容展開其相關(guān)例題,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • Python3.10耙梳加密算法Encryption種類及開發(fā)場景

    Python3.10耙梳加密算法Encryption種類及開發(fā)場景

    這篇文章主要為大家介紹了Python3.10加密,各種加密,耙梳加密算法Encryption種類及開發(fā)場景運用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 如何輕松實現(xiàn)Python數(shù)組降維?

    如何輕松實現(xiàn)Python數(shù)組降維?

    歡迎來到Python數(shù)組降維實現(xiàn)方法的指南!這里,你將探索一種神秘又強大的編程技術(shù),想要提升你的Python編程技巧嗎?別猶豫,跟我一起深入探索吧!
    2024-01-01
  • 淺析關(guān)于Keras的安裝(pycharm)和初步理解

    淺析關(guān)于Keras的安裝(pycharm)和初步理解

    Keras 是一個用 Python 編寫的高級神經(jīng)網(wǎng)絡(luò) API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為后端運行。這篇文章給大家介紹Keras的安裝(pycharm)和初步理解,感興趣的朋友一起看看吧
    2020-10-10
  • Python轉(zhuǎn)換HTML到Text純文本的方法

    Python轉(zhuǎn)換HTML到Text純文本的方法

    這篇文章主要介紹了Python轉(zhuǎn)換HTML到Text純文本的方法,分析了常用的兩種方法,非常具有實用價值,需要的朋友可以參考下
    2015-01-01
  • Python全局變量global關(guān)鍵字詳解

    Python全局變量global關(guān)鍵字詳解

    這篇文章主要介紹了Python全局變量global關(guān)鍵字詳解,需要的朋友可以參考下
    2021-04-04
  • Python接口測試get請求過程詳解

    Python接口測試get請求過程詳解

    這篇文章主要介紹了python接口測試 get請求過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Python中socket網(wǎng)絡(luò)通信是干嘛的

    Python中socket網(wǎng)絡(luò)通信是干嘛的

    在本篇文章里小編給大家分享的是關(guān)于Python中socket網(wǎng)絡(luò)通信知識點內(nèi)容,需要的朋友們可以跟著學(xué)習(xí)下。
    2020-05-05
  • 對PyQt5中的菜單欄和工具欄實例詳解

    對PyQt5中的菜單欄和工具欄實例詳解

    今天小編就為大家分享一篇對PyQt5中的菜單欄和工具欄實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論