python實現各種常用演算法之資料結構(1)

2021-10-01 17:19:00 字數 4419 閱讀 8301

棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。

棧允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(push),刪除則稱為退棧(pop)。

由於堆疊資料結構只允許在一端進行操作,因而按照後進先出(lifo, last in first out)的原理運作。棧也稱為後進先出表。

複雜度分析

棧屬於常見的一種線性結構,對於進棧和退棧而言,時間複雜度都為 o(1)

對棧進行初始化引數設計

具體實現**如下:

class

stack

(object):

def__init__

(self, limit=10)

: self.stack =

# 存放元素

self.limit = limit # 棧容量極限

壓入 push :將新元素放在棧頂

當新元素入棧時,棧頂上移,新元素放在棧頂。

具體實現**如下:

def

push

(self, data)

:# 判斷棧是否溢位

iflen

(self.stack)

>= self.limit:

raise indexerror(

'超出棧容量極限'

)

彈出 pop :從棧頂移出乙個資料

棧頂元素拷貝出來

棧頂下移

拷貝出來的棧頂作為函式返回值

具體實現**如下:

def

pop(self)

:if self.stack:

return self.stack.pop(

)else

:raise indexerror(

'pop from an empty stack'

)# 空棧不能被彈出

peek : 檢視堆疊的最上面的元素

is_empty : 判斷棧是否為空

size : 返回棧的大小

具體實現**如下:

def

peek

(self)

:if self.stack:

return self.stack[-1

]def

is_empty

(self)

:return

notbool

(self.stack)

defsize

(self)

:return

len(self.stack)

完整**如下:

class

stack

(object):

def__init__

(self, limit=10)

: self.stack =

# 存放元素

self.limit = limit # 棧容量極限

defpush

(self, data)

:# 判斷棧是否溢位

iflen

(self.stack)

>= self.limit:

raise indexerror(

'超出棧容量極限'

)def

pop(self)

:if self.stack:

return self.stack.pop(

)else

:# 空棧不能被彈出元素

raise indexerror(

'pop from an empty stack'

)def

peek

(self)

:# 檢視棧的棧頂元素(最上面的元素)

if self.stack:

return self.stack[-1

]def

is_empty

(self)

:# 檢視堆疊的最上面的元素

return

notbool

(self.stack判斷棧是否溢)

defsize

(self)

:# 返回棧的大小

return

len(self.stack)

目標:

我們要求使用乙個堆疊檢查括號字串是否平衡

有效括號字串需滿足:

1.左括號必須用相同型別的右括號閉合。

2.左括號必須以正確的順序閉合。

3.注意空字串可被認為是有效字串。

舉例:((())): true

((()): false

(())): false

class

stack

(object):

def__init__

(self,limit=10)

:#存放元素

self.stack=

#棧的最大容量

self.limit=limit

defpush

(self,data)

:#判斷棧容量是否超出範圍

iflen

(self.stack)

>=self.limit:

raise indexerror(

'超出棧的容量極限'

)#如果沒有超出容量極限,則壓棧

defpop

(self)

:#彈出元素

if self.stack:

return self.stack.pop(

)else

:#空棧不能彈出元素

raise indexerror(

"pop from an empty stack"

)def

peek

(self)

:#檢視棧頂元素

if self.stack:

return self.stack[-1

]def

is_empty

(self)

:#判斷棧是否為空

return

notbool

(self.stack)

defsize

(self)

:#返回棧的大小

return

len(self.stack)

defbalanced_parentheses

(parentheses)

:#例項化stack,傳入最大容量極限

stack=stack(

len(parentheses)

)#迴圈遍歷陣列中的元素

for parenthesis in parentheses:

#如果是左括號則入棧

if parenthesis==

"(":

stack.push(parenthesis)

#如果是右括號,判斷是否非空,非空則出棧

elif parenthesis==

")":

if stack.is_empty():

return

false

stack.pop(

)#如果出棧次數==入棧次數,則此時棧為空,返回為true,否則會提前返回false

return stack.is_empty(

)if __name__ ==

'__main__'

:#初始化陣列進行測試

examples=

["((()))"

,"((())"

,"(()))"

]print

("括號匹配情況如下:\n"

)#迴圈遍歷,檢測括號匹配是否符合要求

python實現各種常用演算法之搜尋演算法(12)

順序搜尋也稱為線性搜尋,屬於無序查詢演算法。演算法原理 思路 從資料結構線性表的一端開始,順序掃瞄,依次將掃瞄到的結點關鍵字與給定值 k 相比較,若相等則表示查詢成功 若掃瞄結束仍沒有找到關鍵字等於 k 的結點,表示查詢失敗。複雜度分析 演算法實現 思路 從順序表的頭部依次遍歷元素,判斷是否匹配,若...

python實現各種常用演算法之資料結構(7)

並查集的介紹 建立乙個 union find 的類,並初始化。初始化兩個字典,乙個儲存節點的父節點,另外乙個儲存父節點的大小。初始化的時候,將節點的父節點設為自身,size 設為 1。class union find object def init self,data list self.fathe...

python實現各種常用演算法之資料結構(8)

字典樹的主要性質 根節點不包含字元,除根節點外每乙個節點都只包含乙個字元 從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串 每個節點的所有子節點包含的字元都不相同。基本功能實現 建立乙個 trienode 的類,構建內建字典結構 class trienode def init sel...