中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python數據結構與算法中的棧怎么構建

發布時間:2022-03-09 16:11:31 來源:億速云 閱讀:179 作者:iii 欄目:開發技術

本篇內容主要講解“Python數據結構與算法中的棧怎么構建”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python數據結構與算法中的棧怎么構建”吧!

什么是棧

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

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

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

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

構建一個棧

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

  • 將一個元素添加到棧的頂端

  • 將棧頂端的元素移除

  • 返回棧頂端的元素

  • 返回棧中元素的數目

明確了棧的基本特性之后,我們開始用代碼構建它。在面向對象的編程語言中(以Python為例),每當需要在Python中實現像棧這樣的抽象數據類型時 ,就可以通過創建一個類的途徑實現它,且數據類型的特性、操作方法等也可以通過在類中定義方法實現。

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

  • 創建一個空棧。它不需要參數,且會返回一個空棧。 Stack()

  • 將一個元素添加到棧的頂端。它需要一 個參數item ,且無返回值。 push(item)

  • 將棧頂端的元素移除。它不需要參數,但會返回頂端的元素,并且修改棧的內容。 pop()

  • 返回棧頂端的元素,但是并不移除該元素。 它不需要參數,也不會修改棧的內容。 peek()

  • 返回棧中元素的數目。它不需要參數,且會返回一個整數。 size()

  • 檢查棧是否為空。它不需要參數,且會返回一個布爾值。 isEmpty()

  • 打印這個棧/列表,它不需要參數,會輸出棧的內容。 look()

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

class Stack:
  # 定義一個列表/構造一個棧
  def __init__(self):
  	self.items = []
  	print("你創造了一個棧!")
  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)

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

Python數據結構與算法中的棧怎么構建

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

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)

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

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

到此,相信大家對“Python數據結構與算法中的棧怎么構建”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

防城港市| 临泽县| 麻江县| 漠河县| 伊金霍洛旗| 东台市| 金昌市| 麻阳| 淅川县| 阿拉善右旗| 荔波县| 乌海市| 卫辉市| 黄石市| 贡嘎县| 琼结县| 德令哈市| 台东县| 法库县| 冀州市| 娄烦县| 迭部县| 凌云县| 大英县| 桓台县| 博野县| 新竹市| 邵阳县| 灌云县| 锦屏县| 深泽县| 齐河县| 轮台县| 七台河市| 马边| 邳州市| 岗巴县| 布尔津县| 天长市| 宁津县| 资兴市|