Skip to content

Commit 9aa046c

Browse files
committed
补充第 300 ~ 399 题的题目解析(增加 13 道题)
1 parent c55ca0e commit 9aa046c

19 files changed

+1945
-3
lines changed
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
class Node:
2+
"""双向链表节点"""
3+
def __init__(self, value):
4+
self.value = value # 节点值
5+
self.prev = None # 指向前一个节点的指针
6+
self.next = None # 指向后一个节点的指针
7+
8+
class Deque:
9+
"""双向队列实现 - 链式存储"""
10+
def __init__(self):
11+
"""初始化空双向队列"""
12+
# 创建哨兵节点
13+
self.head = Node(0) # 头哨兵节点
14+
self.tail = Node(0) # 尾哨兵节点
15+
self.head.next = self.tail
16+
self.tail.prev = self.head
17+
self.size = 0 # 队列大小
18+
19+
def is_empty(self):
20+
"""判断队列是否为空"""
21+
return self.size == 0
22+
23+
def get_size(self):
24+
"""获取队列大小"""
25+
return self.size
26+
27+
def push_front(self, value):
28+
"""队头入队"""
29+
new_node = Node(value)
30+
# 在头哨兵节点后插入新节点
31+
new_node.next = self.head.next
32+
new_node.prev = self.head
33+
self.head.next.prev = new_node
34+
self.head.next = new_node
35+
self.size += 1
36+
37+
def push_back(self, value):
38+
"""队尾入队"""
39+
new_node = Node(value)
40+
# 在尾哨兵节点前插入新节点
41+
new_node.prev = self.tail.prev
42+
new_node.next = self.tail
43+
self.tail.prev.next = new_node
44+
self.tail.prev = new_node
45+
self.size += 1
46+
47+
def pop_front(self):
48+
"""队头出队"""
49+
if self.is_empty():
50+
raise Exception('Deque is empty')
51+
52+
# 删除头哨兵节点后的第一个节点
53+
node = self.head.next
54+
self.head.next = node.next
55+
node.next.prev = self.head
56+
self.size -= 1
57+
return node.value
58+
59+
def pop_back(self):
60+
"""队尾出队"""
61+
if self.is_empty():
62+
raise Exception('Deque is empty')
63+
64+
# 删除尾哨兵节点前的第一个节点
65+
node = self.tail.prev
66+
self.tail.prev = node.prev
67+
node.prev.next = self.tail
68+
self.size -= 1
69+
return node.value
70+
71+
def peek_front(self):
72+
"""查看队头元素"""
73+
if self.is_empty():
74+
raise Exception('Deque is empty')
75+
return self.head.next.value
76+
77+
def peek_back(self):
78+
"""查看队尾元素"""
79+
if self.is_empty():
80+
raise Exception('Deque is empty')
81+
return self.tail.prev.value
82+
83+
class ArrayDeque:
84+
"""双向队列实现 - 顺序存储"""
85+
def __init__(self, capacity=100):
86+
"""初始化双向队列"""
87+
self.capacity = capacity
88+
self.queue = [None] * capacity
89+
self.front = 0 # 队头指针
90+
self.rear = 0 # 队尾指针
91+
self.size = 0 # 队列大小
92+
93+
def is_empty(self):
94+
"""判断队列是否为空"""
95+
return self.size == 0
96+
97+
def is_full(self):
98+
"""判断队列是否已满"""
99+
return self.size == self.capacity
100+
101+
def get_size(self):
102+
"""获取队列大小"""
103+
return self.size
104+
105+
def push_front(self, value):
106+
"""队头入队"""
107+
if self.is_full():
108+
raise Exception('Deque is full')
109+
110+
# 队头指针向前移动
111+
self.front = (self.front - 1) % self.capacity
112+
self.queue[self.front] = value
113+
self.size += 1
114+
115+
def push_back(self, value):
116+
"""队尾入队"""
117+
if self.is_full():
118+
raise Exception('Deque is full')
119+
120+
self.queue[self.rear] = value
121+
# 队尾指针向后移动
122+
self.rear = (self.rear + 1) % self.capacity
123+
self.size += 1
124+
125+
def pop_front(self):
126+
"""队头出队"""
127+
if self.is_empty():
128+
raise Exception('Deque is empty')
129+
130+
value = self.queue[self.front]
131+
# 队头指针向后移动
132+
self.front = (self.front + 1) % self.capacity
133+
self.size -= 1
134+
return value
135+
136+
def pop_back(self):
137+
"""队尾出队"""
138+
if self.is_empty():
139+
raise Exception('Deque is empty')
140+
141+
# 队尾指针向前移动
142+
self.rear = (self.rear - 1) % self.capacity
143+
value = self.queue[self.rear]
144+
self.size -= 1
145+
return value
146+
147+
def peek_front(self):
148+
"""查看队头元素"""
149+
if self.is_empty():
150+
raise Exception('Deque is empty')
151+
return self.queue[self.front]
152+
153+
def peek_back(self):
154+
"""查看队尾元素"""
155+
if self.is_empty():
156+
raise Exception('Deque is empty')
157+
return self.queue[(self.rear - 1) % self.capacity]
158+
159+
# 测试代码
160+
if __name__ == "__main__":
161+
print("=== 链式存储双向队列测试 ===")
162+
deque = Deque()
163+
164+
# 测试队尾入队
165+
deque.push_back(1)
166+
deque.push_back(2)
167+
deque.push_back(3)
168+
print(f"队尾入队后,队列大小: {deque.get_size()}")
169+
print(f"队头元素: {deque.peek_front()}")
170+
print(f"队尾元素: {deque.peek_back()}")
171+
172+
# 测试队头入队
173+
deque.push_front(0)
174+
print(f"队头入队后,队列大小: {deque.get_size()}")
175+
print(f"队头元素: {deque.peek_front()}")
176+
print(f"队尾元素: {deque.peek_back()}")
177+
178+
# 测试出队操作
179+
print(f"队头出队: {deque.pop_front()}")
180+
print(f"队尾出队: {deque.pop_back()}")
181+
print(f"出队后,队列大小: {deque.get_size()}")
182+
183+
print("\n=== 顺序存储双向队列测试 ===")
184+
array_deque = ArrayDeque(capacity=5)
185+
186+
# 测试队尾入队
187+
array_deque.push_back(1)
188+
array_deque.push_back(2)
189+
array_deque.push_back(3)
190+
print(f"队尾入队后,队列大小: {array_deque.get_size()}")
191+
print(f"队头元素: {array_deque.peek_front()}")
192+
print(f"队尾元素: {array_deque.peek_back()}")
193+
194+
# 测试队头入队
195+
array_deque.push_front(0)
196+
print(f"队头入队后,队列大小: {array_deque.get_size()}")
197+
print(f"队头元素: {array_deque.peek_front()}")
198+
print(f"队尾元素: {array_deque.peek_back()}")
199+
200+
# 测试出队操作
201+
print(f"队头出队: {array_deque.pop_front()}")
202+
print(f"队尾出队: {array_deque.pop_back()}")
203+
print(f"出队后,队列大小: {array_deque.get_size()}")
204+
205+
# 测试循环队列特性
206+
print("\n=== 循环队列特性测试 ===")
207+
array_deque.push_back(4)
208+
array_deque.push_back(5)
209+
array_deque.push_front(6)
210+
print(f"队列大小: {array_deque.get_size()}")
211+
print(f"是否已满: {array_deque.is_full()}")
212+
213+
# 清空队列
214+
while not array_deque.is_empty():
215+
print(f"出队: {array_deque.pop_front()}")
216+
217+
print(f"队列是否为空: {array_deque.is_empty()}")

0 commit comments

Comments
 (0)