在計算機科學中,棧(Stack)和隊列(Queue)是兩種非常重要的數據結構。它們都是線性數據結構,但在數據的插入和刪除操作上有著不同的規則。本文將詳細介紹如何在Python中實現棧和隊列,并探討它們的應用場景。
棧是一種遵循后進先出(LIFO, Last In First Out)原則的數據結構。這意味著最后一個被添加到棧中的元素將是第一個被移除的元素。棧的操作主要包括:
在Python中,??梢酝ㄟ^列表(List)來實現。列表的append()
方法可以用于實現push
操作,而pop()
方法可以用于實現pop
操作。
class Stack:
def __init__(self):
self.items = []
def is_empty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
if self.is_empty():
raise IndexError("pop from empty stack")
return self.items.pop()
def peek(self):
if self.is_empty():
raise IndexError("peek from empty stack")
return self.items[-1]
def size(self):
return len(self.items)
def __str__(self):
return str(self.items)
棧在計算機科學中有廣泛的應用,例如:
def is_balanced(expression):
stack = Stack()
for char in expression:
if char in "({[":
stack.push(char)
elif char in ")}]":
if stack.is_empty():
return False
top = stack.pop()
if not matches(top, char):
return False
return stack.is_empty()
def matches(open, close):
opens = "({["
closes = ")}]"
return opens.index(open) == closes.index(close)
# 測試
print(is_balanced("({[]})")) # True
print(is_balanced("({[}])")) # False
隊列是一種遵循先進先出(FIFO, First In First Out)原則的數據結構。這意味著第一個被添加到隊列中的元素將是第一個被移除的元素。隊列的操作主要包括:
在Python中,隊列可以通過列表(List)來實現。列表的append()
方法可以用于實現enqueue
操作,而pop(0)
方法可以用于實現dequeue
操作。然而,使用pop(0)
會導致性能問題,因為每次刪除第一個元素時,列表中的所有元素都需要向前移動。
為了提高性能,可以使用collections.deque
來實現隊列。deque
是一個雙端隊列,支持在兩端高效地添加和刪除元素。
from collections import deque
class Queue:
def __init__(self):
self.items = deque()
def is_empty(self):
return len(self.items) == 0
def enqueue(self, item):
self.items.append(item)
def dequeue(self):
if self.is_empty():
raise IndexError("dequeue from empty queue")
return self.items.popleft()
def peek(self):
if self.is_empty():
raise IndexError("peek from empty queue")
return self.items[0]
def size(self):
return len(self.items)
def __str__(self):
return str(self.items)
隊列在計算機科學中也有廣泛的應用,例如:
from collections import defaultdict, deque
class Graph:
def __init__(self):
self.graph = defaultdict(list)
def add_edge(self, u, v):
self.graph[u].append(v)
def bfs(self, start):
visited = set()
queue = Queue()
queue.enqueue(start)
visited.add(start)
while not queue.is_empty():
vertex = queue.dequeue()
print(vertex, end=" ")
for neighbor in self.graph[vertex]:
if neighbor not in visited:
queue.enqueue(neighbor)
visited.add(neighbor)
# 測試
g = Graph()
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 2)
g.add_edge(2, 0)
g.add_edge(2, 3)
g.add_edge(3, 3)
print("廣度優先搜索 (從頂點 2 開始):")
g.bfs(2)
操作 | 棧(Stack) | 隊列(Queue) |
---|---|---|
插入 | push | enqueue |
刪除 | pop | dequeue |
查看頂部 | peek | peek |
是否為空 | is_empty | is_empty |
大小 | size | size |
應用場景 | 棧(Stack) | 隊列(Queue) |
---|---|---|
函數調用棧 | ?? | ? |
表達式求值 | ?? | ? |
括號匹配 | ?? | ? |
撤銷操作 | ?? | ? |
任務調度 | ? | ?? |
打印隊列 | ? | ?? |
消息隊列 | ? | ?? |
廣度優先搜索(BFS) | ? | ?? |
棧和隊列是兩種基本的數據結構,它們在計算機科學中有著廣泛的應用。棧遵循后進先出(LIFO)的原則,適用于需要回溯操作的場景,如函數調用、表達式求值和括號匹配。隊列遵循先進先出(FIFO)的原則,適用于需要按順序處理任務的場景,如任務調度、打印隊列和廣度優先搜索。
在Python中,??梢酝ㄟ^列表(List)來實現,而隊列則可以通過collections.deque
來實現。選擇合適的實現方式可以提高代碼的性能和可讀性。
通過本文的介紹,希望讀者能夠理解棧和隊列的基本概念,并能夠在實際編程中靈活運用這兩種數據結構。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。