@@ -294,53 +294,66 @@ Python:
294
294
295
295
``` python
296
296
from collections import deque
297
+
297
298
class MyStack :
299
+
298
300
def __init__ (self ):
299
301
"""
300
- Initialize your data structure here.
302
+ Python普通的Queue或SimpleQueue没有类似于peek的功能
303
+ 也无法用索引访问,在实现top的时候较为困难。
304
+
305
+ 用list可以,但是在使用pop(0)的时候时间复杂度为O(n)
306
+ 因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能
307
+
308
+ in - 存所有数据
309
+ out - 仅在pop的时候会用到
301
310
"""
302
- # 使用两个队列来实现
303
- self .que1 = deque()
304
- self .que2 = deque()
311
+ self .queue_in = deque()
312
+ self .queue_out = deque()
305
313
306
314
def push (self , x : int ) -> None :
307
315
"""
308
- Push element x onto stack.
316
+ 直接append即可
309
317
"""
310
- self .que1.append(x)
318
+ self .queue_in.append(x)
319
+
311
320
312
321
def pop (self ) -> int :
313
322
"""
314
- Removes the element on top of the stack and returns that element.
323
+ 1. 首先确认不空
324
+ 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out
325
+ 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out
326
+ 4. 交换in和out,此时out里只有一个元素
327
+ 5. 把out中的pop出来,即是原队列的最后一个
328
+
329
+ tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像
330
+ stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换
315
331
"""
316
- size = len (self .que1)
317
- size -= 1 # 这里先减一是为了保证最后面的元素
318
- while size > 0 :
319
- size -= 1
320
- self .que2.append(self .que1.popleft())
321
-
332
+ if self .empty():
333
+ return None
322
334
323
- result = self .que1.popleft()
324
- self .que1, self .que2= self .que2, self .que1# 将que2和que1交换 que1经过之前的操作应该是空了
325
- # 一定注意不能直接使用que1 = que2 这样que2的改变会影响que1 可以用浅拷贝
326
- return result
335
+ for i in range (len (self .queue_in) - 1 ):
336
+ self .queue_out.append(self .queue_in.popleft())
337
+
338
+ self .queue_in, self .queue_out = self .queue_out, self .queue_in # 交换in和out,这也是为啥in只用来存
339
+ return self .queue_out.popleft()
327
340
328
341
def top (self ) -> int :
329
342
"""
330
- Get the top element.
343
+ 1. 首先确认不空
344
+ 2. 我们仅有in会存放数据,所以返回第一个即可
331
345
"""
332
- return self .que1[- 1 ]
346
+ if self .empty():
347
+ return None
348
+
349
+ return self .queue_in[- 1 ]
350
+
333
351
334
352
def empty (self ) -> bool :
335
353
"""
336
- Returns whether the stack is empty.
354
+ 因为只有in存了数据,只要判断in是不是有数即可
337
355
"""
338
- # print(self.que1)
339
- if len (self .que1) == 0 :
340
- return True
341
- else :
342
- return False
343
-
356
+ return len (self .queue_in) == 0
344
357
345
358
```
346
359
0 commit comments