当前位置:   article > 正文

代码随想录算法训练营17期day10-python_代码随想录 python

代码随想录 python

一、用栈实现队列

  1. '''
  2. 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
  3. 实现 MyQueue 类:
  4. void push(int x) 将元素 x 推到队列的末尾
  5. int pop() 从队列的开头移除并返回元素
  6. int peek() 返回队列开头的元素
  7. boolean empty() 如果队列为空,返回 true ;否则,返回 false
  8. '''
  9. class MyQueue:
  10. def __init__(self):
  11. #定义两个列表,一个模拟进队列,一个模拟出队列
  12. self.stack_in = []
  13. self.stack_out = []
  14. def push(self, x: int) -> None:
  15. #入队列,利用列表的append函数进行push
  16. self.stack_in.append(x)
  17. def pop(self) -> int:
  18. #获取队列头部的元素
  19. if self.empty():
  20. return None
  21. else:
  22. for i in range(len(self.stack_in)):
  23. self.stack_out.append(self.stack_in.pop())
  24. return self.stack_out.pop()
  25. def peek(self) -> int:
  26. #返回队列中的第一个元素,先出队列,获取元素,在将元素append回去(题目要求仅返回元素,要保证队列不被修改)
  27. ans = self.pop()
  28. self.stack_out.append(ans)
  29. return ans
  30. def empty(self) -> bool:
  31. #判断是否为空,如果stack_in或者stack_out为空,返回true,否则返回false
  32. return not(self.stack_in or self.stack_out )

2、用队列实现栈

  1. '''
  2. 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
  3. 实现 MyStack 类:
  4. void push(int x) 将元素 x 压入栈顶。
  5. int pop() 移除并返回栈顶元素。
  6. int top() 返回栈顶元素。
  7. boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
  8. 来源:力扣(LeetCode)
  9. 链接:https://leetcode.cn/problems/implement-stack-using-queues
  10. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  11. '''
  12. from collections import deque
  13. class MyStack:
  14. def __init__(self):
  15. """
  16. Python普通的Queue或SimpleQueue没有类似于peek的功能
  17. 也无法用索引访问,在实现top的时候较为困难。
  18. 用list可以,但是在使用pop(0)的时候时间复杂度为O(n)
  19. 因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能
  20. in - 存所有数据
  21. out - 仅在pop的时候会用到
  22. """
  23. self.queue_in = deque()
  24. self.queue_out = deque()
  25. def push(self, x: int) -> None:
  26. """
  27. 直接append即可
  28. """
  29. self.queue_in.append(x)
  30. def pop(self) -> int:
  31. """
  32. 1. 首先确认不空
  33. 2. 因为队列的特殊性,FIFO,所以我们只有在pop()的时候才会使用queue_out
  34. 3. 先把queue_in中的所有元素(除了最后一个),依次出列放进queue_out
  35. 4. 交换in和out,此时out里只有一个元素
  36. 5. 把out中的pop出来,即是原队列的最后一个
  37. tip:这不能像栈实现队列一样,因为另一个queue也是FIFO,如果执行pop()它不能像
  38. stack一样从另一个pop(),所以干脆in只用来存数据,pop()的时候两个进行交换
  39. """
  40. if self.empty():
  41. return None
  42. for i in range(len(self.queue_in) - 1):
  43. self.queue_out.append(self.queue_in.popleft())
  44. self.queue_in, self.queue_out = self.queue_out, self.queue_in # 交换in和out,这也是为啥in只用来存
  45. return self.queue_out.popleft()
  46. def top(self) -> int:
  47. """
  48. 1. 首先确认不空
  49. 2. 我们仅有in会存放数据,所以返回第一个即可
  50. """
  51. if self.empty():
  52. return None
  53. return self.queue_in[-1]
  54. def empty(self) -> bool:
  55. """
  56. 因为只有in存了数据,只要判断in是不是有数即可
  57. """
  58. return len(self.queue_in) == 0

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/618876
推荐阅读
相关标签
  

闽ICP备14008679号