棧(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...