資料結構與演算法(棧與佇列)

2021-10-02 15:17:30 字數 3763 閱讀 7884

棧(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 若棧存在,...