一、栈和队列的基本介绍
栈(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/n/133585.html
微信扫一扫
支付宝扫一扫