掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
什么是堆棧?

堆棧是一個(gè)數(shù)據(jù)結(jié)構(gòu),其存儲(chǔ)在一個(gè)后進(jìn)/先出的方式的項(xiàng)目。這通常被稱為L(zhǎng)IFO。這與隊(duì)列形成對(duì)比,隊(duì)列以先入/先出(FIFO)方式存儲(chǔ)項(xiàng)目。
使用list創(chuàng)建一個(gè)python堆棧
list您可能經(jīng)常在程序中使用的內(nèi)置結(jié)構(gòu)可用作堆棧。相反的.push(),你可以使用.append()新的元素添加到您的堆棧的頂部,同時(shí).pop()除去了LIFO順序的元素:
>>> myStack = []
>>> myStack.append('a')
>>> myStack.append('b')
>>> myStack.append('c')
>>> myStack
['a', 'b', 'c']
>>> myStack.pop()
'c'
>>> myStack.pop()
'b'
>>> myStack.pop()
'a'
>>> myStack.pop()
Traceback (most recent call last):
File "", line 1, in
IndexError: pop from empty list 你可以在最后的命令中看到,如果你調(diào)用空堆棧,list它將引發(fā)一個(gè)。IndexError.pop()
list有熟悉的優(yōu)點(diǎn)。你知道它是如何工作的,并且可能已經(jīng)在你的程序中使用它了。
不幸的是,list與其他數(shù)據(jù)結(jié)構(gòu)相比,您會(huì)看到一些缺點(diǎn)。問題是隨著它的發(fā)展,它會(huì)遇到速度問題。list存儲(chǔ)a 中的項(xiàng)目的目的是提供對(duì)中的隨機(jī)元素的快速訪問list。在較高級(jí)別,這意味著項(xiàng)目在內(nèi)存中彼此相鄰存儲(chǔ)。
如果你的堆棧比當(dāng)前擁有它的內(nèi)存塊大,那么Python需要做一些內(nèi)存分配。這可能導(dǎo)致一些.append()呼叫比其他呼叫花費(fèi)更長(zhǎng)的時(shí)間。
還有一個(gè)不太嚴(yán)重的問題。如果您使用.insert()在末尾以外的位置向堆棧添加元素,則可能需要更長(zhǎng)時(shí)間。但是,這通常不是你要對(duì)堆棧做的事情。
下一個(gè)數(shù)據(jù)結(jié)構(gòu)將幫助您解決您看到的重新分配問題list。
使用collections.deque創(chuàng)建一個(gè)Python堆棧
該collections模塊包含deque,這對(duì)于創(chuàng)建Python堆棧很有用。deque發(fā)音為“deck”,代表“雙端隊(duì)列”。
您可以使用同樣的方法deque,你上面看到的list,.append()和.pop():
>>> from collections import deque
>>> myStack = deque()
>>> myStack.append('a')
>>> myStack.append('b')
>>> myStack.append('c')
>>> myStack
deque(['a', 'b', 'c'])
>>> myStack.pop()
'c'
>>> myStack.pop()
'b'
>>> myStack.pop()
'a'
>>> myStack.pop()
Traceback (most recent call last):
File "", line 1, in
IndexError: pop from an empty deque 這看起來幾乎與list上面的例子相同。此時(shí),您可能想知道為什么Python核心開發(fā)人員會(huì)創(chuàng)建兩個(gè)看起來相同的數(shù)據(jù)結(jié)構(gòu)。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流