一、棧和隊列的基本介紹
棧(Stack)和隊列(Queue)是兩種經典的數據結構,用於在計算機程序中存儲和管理數據。棧是一種後進先出(LIFO)的數據結構,只允許在棧頂進行插入和刪除操作。隊列是一種先進先出(FIFO)的數據結構,只允許在隊列尾部進行插入操作,在隊列頭部進行刪除操作。
下面是棧和隊列的簡單Python代碼實現:
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def is_empty(self):
return len(self.items) == 0
class Queue:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
return self.items.pop(0)
def is_empty(self):
return len(self.items) == 0
二、基本操作的差異
棧和隊列的主要區別在於它們的基本操作。在棧中,元素的插入和刪除只能在棧頂進行,而隊列中元素的插入只能在隊列尾部進行,刪除操作則只能在隊列頭部進行。這意味著在棧中最後插入的元素會被最先刪除,而在隊列中最先插入的元素會被最先刪除。
下面是分別實現了棧和隊列的基本操作代碼:
# 棧
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def is_empty(self):
return len(self.items) == 0
# 隊列
class Queue:
def __init__(self):
self.items = []
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
return self.items.pop(0)
def is_empty(self):
return len(self.items) == 0
三、性能差異
棧和隊列的另一個主要區別是它們的性能差異。在棧中,插入和刪除操作的時間複雜度都是O(1),因為只需要操作棧頂的元素。而在隊列中,插入操作的時間複雜度也是O(1),但刪除操作的時間複雜度為O(n),因為需要將所有的元素向前移動一位。
下面是分別實現了棧和隊列的性能比較代碼:
import time
# 棧
s = Stack()
start = time.time()
for i in range(1000000):
s.push(i)
while not s.is_empty():
s.pop()
end = time.time()
print("Time used for Stack:", end-start)
# 隊列
q = Queue()
start = time.time()
for i in range(1000000):
q.enqueue(i)
while not q.is_empty():
q.dequeue()
end = time.time()
print("Time used for Queue:", end-start)
四、應用場景的不同
棧和隊列在不同的應用場景中有不同的用途。棧通常用於處理遞歸和回溯問題,以及表達式的計算和括弧匹配。隊列則常用於解決如廣度優先搜索(BFS)等問題。同時,隊列還常被用於實現具有緩衝區的數據傳輸。
下面是棧和隊列分別應用於表達式括弧匹配的代碼實現:
# 棧應用:表達式括弧匹配
def is_balanced(expr):
s = Stack()
for char in expr:
if char in ['(', '[', '{']:
s.push(char)
elif char in [')', ']', '}']:
if s.is_empty():
return False
top = s.pop()
if not is_match(top, char):
return False
return s.is_empty()
def is_match(p1, p2):
return (p1 == '(' and p2 == ')') or (p1 == '[' and p2 == ']') or (p1 == '{' and p2 == '}')
print(is_balanced("(Pangolin)[Python]")) # True
print(is_balanced("{Python(Jupyter)}[Java]")) # True
print(is_balanced("({Python][Jupyter)}")) # False
# 隊列應用:BFS實現圖的遍歷
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
vertex = queue.popleft()
print(vertex, end=" ")
for neighbor in graph[vertex]:
if neighbor not in visited:
queue.append(neighbor)
visited.add(neighbor)
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
bfs(graph, 'A')
# 輸出:A B C D E F
原創文章,作者:ACOX,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133585.html
微信掃一掃
支付寶掃一掃