棧和佇列的結構實現
阿新 • • 發佈:2018-12-04
棧
棧(stack),有些地方稱為堆疊,是一種容器,可存入資料元素、訪問元素、刪除元素,它的特點在於只能允許在容器的一端(稱為棧頂端指標,英語:top)進行加入資料(英語:push)和輸出資料(英語:pop)的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問順序。
由於棧資料結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。
寫一個棧類支援以下操作 用python的LIST儲存:
棧的操作
- Stack() 建立一個新的空棧
- push(item) 新增一個新的元素item到棧頂
- pop() 彈出棧頂元素
- peek() 返回棧頂元素
- is_empty() 判斷棧是否為空
- size() 返回棧的元素個數
class Stack: def __init__(self): self.__list = [] def push(self,item):#新增一個新的元素item到棧頂 self.__list.append(item) def pop(self):#彈出棧頂元素 return self.__list.pop() def peek(self):#返回棧頂元素 if self.__list: return self.__list[-1] else: return False def is_empty(self):#判斷棧是否為空 return self.__list == [] def size(self):#返回棧的元素個數 return len(self.__list) if __name__ == '__main__': stack = Stack() stack.push(1) stack.push(2) stack.push(3) stack.push(4) print(stack.pop()) print(stack.pop()) print(stack.pop()) print(stack.pop())
佇列
佇列(queue)是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
佇列是一種先進先出的(First In First Out)的線性表,簡稱FIFO。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作!假設佇列是q=(a1,a2,……,an),那麼a1就是隊頭元素,而an是隊尾元素。這樣我們就可以刪除時,總是從a1開始,而插入時,總是在佇列最後。這也比較符合我們通常生活中的習慣,排在第一個的優先出列,最後來的當然排在隊伍最後。
佇列的實現
同棧一樣,佇列也可以用順序表或者連結串列實現。
操作
- Queue() 建立一個空的佇列
- enqueue(item) 往佇列中新增一個item元素
- dequeue() 從佇列頭部刪除一個元素
- is_empty() 判斷一個佇列是否為空
- size() 返回佇列的大小
在隊頭入隊隊尾隊出隊還是隊頭出隊隊尾入隊,看你個人需求,因為這兩種的出隊入隊總有一個時間複雜度時N一個為1,看你的實際需求,是出隊多還是入隊多。
class Queue:
def __init__(self):
self.__list = []
def enqueue(self,item): #往佇列中新增一個item元素
self.__list.append(item)
# self.__list.insert(0,item)
def dequeue(self):# 從佇列頭部刪除一個元素
# self.__list.dequeue()
return self.__list.pop(0)
def is_empty(self): #判斷一個佇列是否為空
return self.__list == []
def size(self): #返回佇列的大小
return len(self.__list)
if __name__ == '__main__':
queue = Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
print(queue.dequeue())
print(queue.dequeue())
print(queue.dequeue())
print(queue.dequeue())
雙端佇列
雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。
雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。
操作
- Deque() 建立一個空的雙端佇列
- add_front(item) 從隊頭加入一個item元素
- add_rear(item) 從隊尾加入一個item元素
- remove_front() 從隊頭刪除一個item元素
- remove_rear() 從隊尾刪除一個item元素
- is_empty() 判斷雙端佇列是否為空
- size() 返回佇列的大小
class Queue:
def __init__(self):
self.__list = []
def add_front(self,item): #往佇列頭部新增一個item元素
self.__list.insert(0,item)
def add_last(self, item): # 往佇列尾部新增一個item元素
self.__list.append(item)
def pop_front(self):
return self.__list.pop(0)
def pop_last(self):
return self.__list.pop(-1)
def is_empty(self): #判斷一個佇列是否為空
return self.__list == []
def size(self): #返回佇列的大小
return len(self.__list)
if __name__ == '__main__':
queue = Queue()
queue.add_front(1)
queue.add_front(2)
queue.add_last(4)
queue.add_last(5)
queue.add_front(3)
queue.add_last(6)
print(queue.pop_front())
print(queue.pop_last())
print(queue.pop_front())