棧(stack),有些地方稱為堆疊,是一種容器,可存入資料元素、訪問元素、刪除元素,它的特點在於只能允許在容器的一端(稱為棧頂端指標,英語:top)進行加入資料(英語:push)和輸出資料(英語:pop)的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問順序。
由於棧資料結構只允許在一端進行操作,因而按照後進先出(lifo, last in first out)的原理運作。
棧可以用順序表實現,也可以用鍊錶實現。
class stack(object):
"""建立乙個新的空棧"""
def __init__(self):
# 棧可以用順序表或鍊錶實現,同時需要考慮以哪一端作為棧頂。
# 從時間複雜度上考慮,list以列表尾部作為棧頂較合適,入棧出棧複雜度為o(1),鍊錶以頭部作為棧頂較合適,入棧出棧複雜度為o(1)
# 這裡使用順序表
self.list =
def is_empty(self):
"""判斷棧是否為空"""
return self.list ==
# return not self.list
def push(self, item):
"""新增乙個新的元素item到棧頂"""
def pop(self):
"""彈出棧頂元素"""
return self.list.pop()
def peek(self):
"""返回棧頂元素"""
if self.is_empty():
return none
else:
return self.list[-1]
def size(self):
"""返回棧的元素個數"""
return len(self.list)
if __name__ == "__main__":
stack = stack()
stack.push("hello")
stack.push("world")
stack.push("itcast")
print (stack.size())
print (stack.peek())
print (stack.pop())
print (stack.pop())
print (stack.pop())
3
itcast
itcast
world
hello
佇列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
佇列是一種先進先出的(first in first out)的線性表,簡稱fifo。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作!假設佇列是q=(a1,a2,……,an),那麼a1就是隊頭元素,而an是隊尾元素。這樣我們就可以刪除時,總是從a1開始,而插入時,總是在佇列最後。這也比較符合我們通常生活中的習慣,排在第乙個的優先出列,最後來的當然排在隊伍最後。
同棧一樣,佇列也可以用順序表或者鍊錶實現。
class queue(object):
"""建立乙個空的佇列"""
def __init__(self):
self.list =
def enqueue(self, item):
"""往佇列中新增乙個item元素"""
# 列表要先確定**是佇列頭,佇列尾。
# 如果列表尾部為佇列尾,則複雜度入隊列為o(1),出隊列為o(n);若列表頭部為佇列尾,則複雜度是相反的。
# 因此需要根據具體情況,看是入隊還是出隊使用更頻繁來決定
# self.list.insert(0,item) # 列表頭部為佇列尾
def dequeue(self):
"""從佇列頭部刪除乙個元素"""
return self.list.pop(0) # 在列表頭部彈出
# return self.list.pop() # 在列表尾部彈出
def is_empty(self):
"""判斷乙個佇列是否為空"""
return self.list ==
def size(self):
"""返回佇列的大小"""
return len(self.list)
if __name__ == "__main__":
q = queue()
q.enqueue("hello")
q.enqueue("world")
q.enqueue("itcast")
print (q.size())
print (q.dequeue())
print (q.dequeue())
print (q.dequeue())
3
hello
world
itcast
雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。
雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。
"""建立乙個空的雙端佇列"""
def __init__(self):
self.list =
def add_front(self, item):
"""從隊頭加入乙個item元素"""
self.list.insert(0,item)
def add_rear(self, item):
"""從隊尾加入乙個item元素"""
def remove_front(self):
"""從隊頭刪除乙個item元素"""
return self.list.pop(0)
def remove_rear(self):
"""從隊尾刪除乙個item元素"""
return self.list.pop()
def is_empty(self):
"""判斷雙端佇列是否為空"""
return self.list ==
def size(self):
"""返回佇列的大小"""
return len(self.list)
if __name__ == "__main__":
deque = deque()
deque.add_front(1)
deque.add_front(2)
deque.add_rear(3)
deque.add_rear(4)
print (deque.size())
print (deque.remove_front())
print (deque.remove_front())
print (deque.remove_rear())
print (deque.remove_rear())
421
43
資料結構與演算法 棧和佇列
棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...
佇列 棧(資料結構與演算法)
佇列是一種先進先出 fifo 的資料結構,從隊尾進,從隊頭出 在 fifo 資料結構中,將首先處理新增到佇列中的第乙個元素。如上圖所示,佇列是典型的 fifo 資料結構。插入 insert 操作也稱作入隊 enqueue 新元素始終被新增在佇列的末尾。刪除 delete 操作也被稱為出隊 deque...
資料結構與演算法(棧與佇列)
棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,他的特點在於只能允許在容器的一端 稱為棧頂端指標,英語top 進行加入資料 英語push 和輸出資料 英語pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問...