資料結構與演算法 棧(python詳細版附帶例子)

2021-10-05 11:02:06 字數 3530 閱讀 2698

author:小黃

緩慢而堅定的生長

棧是由一系列物件組成的乙個集合,這些物件的插入和刪除遵循後進先出(lifo)的原則。其基本結構如下圖所示,

棧是最簡的資料結構,但同樣也是最重要的書籍結構。

用s表示乙個棧,其基本的一些函式如下:

下面用乙個例子講解一下棧的相關操作:

看完這個例子,相信你們對這個棧有了進一步的了解,下面將用函式來帶你們了解棧。

class

arraystack

:def

__init__

(self)

:# 建立乙個空棧

self._data =

def__len__

(self)

:# 返回棧中的元素數量

return

len(self._data)

defisempty

(self)

:# 如果棧為空則返回「true」

return

len(self._data)==0

defpush

(self,a)

:# 向棧頂新增元素a

defpop

(self)

:# 移除棧頂的元素並返回,如果棧為空,則返回乙個錯誤

if self.isempty():

raise exception(

'stack is empty'

)return self._data.pop(

)def

top(self)

:# 返回棧頂的元素但不移除,如果棧為空,則返回乙個錯誤

if self.isempty():

raise exception(

'stack is empty'

)return self._data[-1

]

複雜度分析:

操作執行時間

s.push(a)

o(1)

s.pop()

o(1)

s.top()

o(1)

s.isempty()

o(1)

s.len()

o(1)

每個開始符合必須與其相對應的結束符合相匹配:

完整**如下:

class

arraystack

:def

__init__

(self)

:# 建立乙個空棧

self._data =

def__len__

(self)

:# 返回棧中的元素數量

return

len(self._data)

defisempty

(self)

:# 如果棧為空則返回「true」

return

len(self._data)==0

defpush

(self,a)

:# 向棧頂新增元素a

defpop

(self)

:# 移除棧頂的元素並返回,如果棧為空,則返回乙個錯誤

if self.isempty():

raise exception(

'stack is empty'

)return self._data.pop(

)def

top(self)

:# 返回棧頂的元素但不移除,如果棧為空,則返回乙個錯誤

if self.isempty():

raise exception(

'stack is empty'

)return self._data[-1

]def

parcheck

(s):

# s是字串型別

a = arraystack(

) balance =

true

# 這是標記

for i in s:

if i ==

'(':

a.push(i)

else

:if a.isempty():

balance =

false

break

else

: a.pop(

)if a.isempty(

)and balance:

return

true

else

:return

false

class

arraystack

:def

__init__

(self)

:# 建立乙個空棧

self._data =

def__len__

(self)

:# 返回棧中的元素數量

return

len(self._data)

defisempty

(self)

:# 如果棧為空則返回「true」

return

len(self._data)==0

defpush

(self,a)

:# 向棧頂新增元素a

defpop

(self)

:# 移除棧頂的元素並返回,如果棧為空,則返回乙個錯誤

if self.isempty():

raise exception(

'stack is empty'

)return self._data.pop(

)def

top(self)

:# 返回棧頂的元素但不移除,如果棧為空,則返回乙個錯誤

if self.isempty():

raise exception(

'stack is empty'

)return self._data[-1

]def

isright

(s):

left =

'])'

a = arraystack(

)for i in s:

if i in left:

a.push(i)

elif i in right:

if a.isempty():

return

false

# 判斷此時右括號與當前棧彈出的左括號的索引是否相同

if right.index(i)

!= left.index(a.pop())

:return

false

return a.isempty(

)

python資料結構與演算法 棧

逆波蘭表示式 reverse polish notation 有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。輸入 2 1 3 輸出 9 解釋 2 1 3 9 分析 棧 遍歷陣列,逐漸壓入棧中,如果遇到運算字元,則彈出棧頂兩個元素,之後將計算結果再壓入棧中 class solu...

python資料結構與演算法 棧

棧 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 p...

資料結構與演算法《棧》

概念 棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使...