棧(stack),有些地方稱為堆疊,是一種容器,可存入資料元素、訪問元素、刪除元素,他的特點在於只能允許在容器的一端(稱為棧頂端指標,英語top)進行加入資料(英語push)和輸出資料(英語pop)的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問順序。
由於棧資料結構只允許在一端進行操作,因而按照後進先出(lifo,last in first out)的原理運作。
佇列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
佇列是一種先進先出的(first in first out)的線性表,簡稱fifo。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作!假設佇列是q=(
a1,a
2,..
.,an
)q=(a_,a_,...,a_)
q=(a1
,a2
,...
,an
),那麼a1a_
a1就是隊頭元素,而ana_
an就是隊尾元素。這樣我們就可以刪除時,總是從a1a_
a1開始,而插入時,總是在佇列最後。這也符合我們生活中的習慣,排在第乙個的優先出列,最後來的當然排在隊伍最後。
棧既可以用順序表實現又可以用鍊錶實現,本文通過順序表進行實現,python中典型的順序表就是列表(list),所以本文借助python重的列表進行實現。
棧的操作
stack()建立乙個新的空棧
push(item)新增乙個新元素item到棧頂
pop()彈出棧頂元素
peek()返回棧頂元素
is_empty()判斷棧是否為空
size()返回棧的元素個數
實現
class stack(object):
"""棧"""
def __init__(self,):
self._list =
def push(self, item):
"""新增乙個新元素item到棧頂"""
def pop(self):
"""彈出棧頂元素"""
return self._list.pop()
def peek(self):
"""返回棧頂元素"""
if self._list:
return self._list[-1]
else:
return none
def is_empty(self):
"""判斷棧是否為空"""
return self.__list ==
def size(self):
"""返回棧的元素個數"""
return len(self._list)
if __name__ == "__main__":
s = stack()
s.push(1)
s.push(2)
s.push(3)
print(s.pop())
print(s.pop())
print(s.pop())
結果3
21
同棧一樣,佇列也可以用順序表或者鍊錶實現
操作queue()建立乙個空的佇列
enqueue(item)往佇列中新增乙個item元素
dequeue()從佇列頭部刪除乙個元素
is_empty()判斷乙個佇列是否為空
size()返回佇列的大小
class queue(object):
"""佇列"""
def __init__(self):
self._list = #用來儲存佇列資料
def enqueue(self, item):
"""往佇列中新增乙個item元素"""
#可以選擇任意一端假如,這裡選擇隊尾
# 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(1)
q.enqueue(2)
q.enqueue(3)
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
結果1
23
雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。
雙端佇列的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。
注:你會發現雙端佇列就像兩個棧合在了一起,每一端都是乙個棧操作
deque()建立乙個空的雙端佇列
add_front(item)從隊頭加入乙個item元素
add_rear(item)從隊尾加入乙個item元素
remove_front()從隊頭刪除乙個item元素
remove_rear()從隊尾刪除乙個item元素
is_empty()判斷雙端佇列是否為空
size()判斷佇列的大小
class deque(object):
"""雙端佇列"""
def __init__(self):
self._list = #用來儲存佇列資料
def add_front(self, item):
"""從隊頭加入乙個item元素"""
#可以選擇任意一端假如,這裡選擇隊尾
self._list.insert(0, item)
def add_rear(self, item):
"""從隊尾加入乙個item元素"""
def pop_front(self):
"""從隊頭刪除乙個元素"""
return self._list.pop(0)
def pop_rear(self):
"""從隊尾刪除乙個元素"""
return self._list.pop()
def is_empty(self):
"""判斷乙個佇列是否為空"""
return self._list ==
def size(self):
"""返回佇列的大小"""
return len(self._list)
佇列 棧(資料結構與演算法)
佇列是一種先進先出 fifo 的資料結構,從隊尾進,從隊頭出 在 fifo 資料結構中,將首先處理新增到佇列中的第乙個元素。如上圖所示,佇列是典型的 fifo 資料結構。插入 insert 操作也稱作入隊 enqueue 新元素始終被新增在佇列的末尾。刪除 delete 操作也被稱為出隊 deque...
資料結構與演算法分析 棧與佇列
以下是對資料結構中的棧和佇列的一些總結 一 棧 棧 stack 是一種特殊的線性表,有後進先出 last in first out,lifo 的性質,且只能從線性表的一段進行插入和刪除元素等操作。棧的常用操作有 進棧 出棧 取棧頂 將棧置空 判斷棧是否為空 判斷棧是否已滿等等。由於棧也屬於線性表,因...
C C 資料結構與演算法 棧與佇列)
棧的鏈式儲存結構 棧的應用 遞迴 佇列棧 stack 是限定僅在表位進行插入和刪除操作的線性表。adt 棧 stack data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。operation initstack s 初始化操作,建立乙個空棧s destroystack s 若棧存在,...