1. 程式人生 > >Python資料結構——雙端佇列

Python資料結構——雙端佇列

雙端佇列(Deque),是一種類似於佇列的元素的有序集合。它擁有兩端,隊首和隊尾,並且元素保持在當前的位置。雙端佇列的一個不同點就是,新增和刪除元素的位置不受限制。新元素可以在隊首或者隊尾新增。同樣地,雙端佇列中的元素可以從兩端彈出。在某種意義上,這種混合的線性結構同時具有棧和佇列的性質。

很重要的一點,即使雙端佇列具有棧和佇列的特性,但它不會被強制執行的LIFO和FIFO操作。這取決於你做出統一的新增和刪除操作。

雙端佇列的操作如下:

1234567 Deque()建立一個空的雙端佇列,無引數,返回值是空佇列。add_front(item)在隊首新增入一個元素,引數是資料項,無返回值。add_rear(item)在隊尾新增入一個元素,引數是資料項,無返回值。remove_front()刪除隊首的元素,不需要引數,返回值是被刪除的元素,佇列本身有變化。remove_rear()刪除隊尾的元素,不需要引數,返回值是被刪除的元素,佇列本身有變化。is_Empty()檢測佇列是否為空。無引數,返回布林值。size()返回佇列元素的個數。無引數,返回一個整數。

雙端佇列操作舉例:

Deque Operation Deque Contents Return Value
d.isEmpty() [] True
d.addRear(4) [4]
d.addRear(‘dog’) [‘dog’,4,]
d.addFront(‘cat’) [‘dog’,4,’cat’]
d.addFront(True) [‘dog’,4,’cat’,True]
d.size() [‘dog’,4,’cat’,True] 4
d.isEmpty() [‘dog’,4,’cat’,True] False
d.addRear(8.4) [8.4,’dog’,4,’cat’,True]
d.removeRear() [‘dog’,4,’cat’,True] 8.4
d.removeFront() [‘dog’,4,’cat’] True

列表 VS 雙端佇列

雙端佇列支援執行緒安全,在雙端佇列的任何一端執行新增和刪除操作,它們的記憶體效率幾乎相同(時間複雜度為O(1))。

雖然list也支援類似的操作,但是它對定長列表的操作表現很不錯,而當遇到pop(0)和insert(0, v)這樣既改變了列表的長度又改變其元素位置的操作時,其時間複雜度就變為O(n)了。

在雙端佇列中最好不使用切片和索引,你可以用popleft和appendleft方法,雙端佇列對這些操作做了優化。在兩端的索引訪問時間複雜度為O(1),但是訪問中間元素的時間複雜度為O(n),速度較慢,對於快速隨機的訪問,還是用列表代替。

列表用於隨機訪問和定長資料的操作,包括切片,而雙端佇列適用於在兩端壓入或彈出元素,索引(但不包括切片)的效率可能低於列表。

實現雙端佇列:

12345678910111213141516171819202122 classDeque:"""模擬雙端佇列"""def __init__(self):self.items=[]def isEmpty(self):returnself.items==[]def addFront(self,item):self.items.append(item)def addRear(self,item):self.items.insert(0,item)def removeFront(self):returnself.items.pop()def removeRear(self):returnself.items.pop(0)def size(self):returnlen(self.items)

以下是測試程式碼:

1234567891011 d=Deque()print(d.isEmpty())d.addRear(4)d.addRear('dog')d.addFront('cat')d.addFront(True)print(d.size())print(d.isEmpty())d.addRear(8.4)print(d.removeRear())print(d.removeFront())

相關推薦

Python資料結構——佇列

雙端佇列(Deque),是一種類似於佇列的元素的有序集合。它擁有兩端,隊首和隊尾,並且元素保持在當前的位置。雙端佇列的一個不同點就是,新增和刪除元素的位置不受限制。新元素可以在隊首或者隊尾新增。同樣地,雙端佇列中的元素可以從兩端彈出。在某種意義上,這種混合的線性結構同時具有棧和

java資料結構——佇列

普通佇列是一端進,另一端出的FIFO形式,而雙端佇列就沒有這樣的限制級,也就是我們可以在佇列兩端進行插入或者刪除操作。接下來使用雙端連結串列來實現一個雙端佇列。 1、引進雙端連結串列 2、構

資料結構--佇列練習題

編寫一個類,只能用兩個棧結構實現佇列,支援佇列的基本操作(push,pop)。 給定一個操作序列ope及它的長度n,其中元素為正數代表push操作,為0代表pop操作,保證操作序列合法且一定含pop操

資料結構python實現佇列

雙端佇列deque 雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。 雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。 程式碼實現 """雙端

資料結構佇列(Deque)

1,雙端佇列定義   雙端佇列:其兩端都可以入列和出列的資料結構,如下圖所示,佇列後面(rear)可以加入和移出資料,佇列前面(front)可以加入和移出資料        雙端佇列操作: deque=Deque() # 建立雙端佇列 addFront(item) #在佇列前面加入資料 a

自己動手實現java資料結構(四)佇列

自己動手實現java資料結構(四)雙端佇列 1.雙端佇列介紹   在介紹雙端佇列之前,我們需要先介紹佇列的概念。和棧相對應,在許多演算法設計中,需要一種"先進先出(First Input First Output)"的資料結構,因而一種被稱為"佇列(Queue)"的資料結構被抽象了出來(因為

2017浙工大院賽預賽 D 簡單的資料結構佇列||陣列模擬】

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K 64bit IO Format: %lld 題目描述 慄醬有一天在網上衝浪的時候發現了一道

三、資料結構演算法-棧、佇列、優先佇列佇列

## 一、Stack (棧) ### 1、資料結構   Stack是棧。它的特性是:**先進後出(FILO, First In Last Out) 後進先出(Last in - First out)**。java工具包中的Stack是繼承於Vector(向量佇列)的,由於Vector是通過陣列實現的,這就意味

【12】python 棧型資料結構模擬、佇列資料結構模擬

一、壓棧操作模擬 #__author:"吉*佳" #date: 2018/10/21 0021 #function:棧 # 棧:即是先進後出的一種資料結構 # (1)模擬壓棧操作 stack=[] flag=True while flag: temp = input("請輸入壓棧元素[

Python資料結構之: 棧與佇列

棧(stacks) 是一種只能通過訪問其一端來實現資料儲存與檢索的線性資料結構,具有後進先出(last in first out,LIFO)的特徵 stack = [] stack.append("A") #A入棧 stack.append("B") #B入棧 st

Python資料結構——佇列(queue)

先入隊的元素先出隊,即先進先出(first in first out,FIFO)。 在python中同樣可以使用列表,來構建一個佇列。 # -*- coding:utf-8 -*- # file: pyqueue.py # class PyQueue: # 建立佇

少說話多寫程式碼之Python學習060——標準模組(佇列

雙端佇列可以從佇列的兩端加入和刪除元素。比如,在需要按照元素增加的順序來移除元素時非常有用。 看下面的使用, 先產生一個雙端佇列。 from collections import deque q = deque(range(5)); print(q) 輸出 deque([0, 1, 2,

python資料結構之棧和佇列

1.功能實現 之前文章有,可以點開看看 棧 佇列 2.應用(1)括號匹配及字尾表示式 class Solution(object): def isValid(self, s): """ :type s: str :rtype

Python資料結構——佇列

佇列是一種列表,不同的是佇列只能在隊尾插入元素,在隊首刪除元素。佇列用於儲存按順序排列的資料,先進先出,這點和棧不一樣,在棧中,最後入棧的元素反而被優先處理。可以將佇列想象成在銀行前排隊的人群,排在最前面的人第一個辦理業務,新來的人只能在後面排隊,直到輪到他們為止。 佇列是一

python 資料結構佇列和棧

# 棧是一種特殊的線性表,僅能線上性表的一端操作,棧頂允許操作,棧底不允許操作。 # 棧的特性:後進先出 class Stack(object): """棧""" def __init__(self): self.items=[] def is_empty(s

Python 標準庫之佇列

寫在之前 雙端佇列(deque)同時具備棧和佇列的特徵,棧是先進後出的資料結構,佇列是先進先出的資料結構(請先知道這個概念),所以雙端佇列可以從序列的任何一端新增和刪除項。 雙端佇列(deque) 首先我們先來看一個簡單的小問題:如果有一個列表,比如 [1,2,3],讓你在最

python語言下棧與佇列佇列的操作

棧:       Stack() 建立一個新的空棧     push(item)新增一個新的元素item到棧頂      peek()返回棧頂元素(不彈出,只讀)     

面試寶典之python資料結構---列表,棧與佇列,連結串列,樹,字典

Python基本資料結構 一、線性表 線性表是最常用且最簡單的一種資料結構,它是n個數據元素的有限序列。 實現線性表的方式一般有兩種,一種是使用陣列儲存線性表的元素,即用一組連續的儲存單元依次儲存線性表的資料元素。另一種是使用連結串列儲存線性表的元素,

python資料結構之棧、佇列與堆

目錄 棧與佇列的基礎知識 使用佇列實現棧 (LeetCode 225) 使用棧實現佇列 (LeetCode 232) 包含min函式的棧(LeetCode 155) 合法的出棧序列 堆的必備基礎知識 陣列中的第K大的數 (LeetCode 215) 尋找中位

Python資料結構 - 利用headp模組尋找最大N個元素並實現優先佇列

用headp找到最大最小的N個值 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, nums)) print(heapq.nsmallest(3, nums)) [42, 37, 23]