当前位置:   article > 正文

队列和栈的实现

队列和栈的实现

本节讲解的队列与栈,如果你对之前的线性和链式结构顺利掌握了,那么下边的队列和栈就小菜一碟了。因为我们会用前两节讲到的东西来实现队列和栈。 之所以放到一起讲是因为这两个东西很类似,队列是先进先出结构(FIFO, first in first out), 栈是后进先出结构(LIFO, last in first out)。

一,队列

队列(Queue)是计算机科学中一种基础的数据结构,它遵循先进先出(First In First Out, FIFO)的原则,即最早进入队列的元素也将是最先离开队列的元素。这个概念类似于现实生活中的排队场景,比如在超市结账,先到达收银台的顾客会先完成结账离开。

1.线式队列

线式队列就是线性表+队列性质组成的数据结构

代码实现

  1. class Array():
  2. def __init__(self,size):
  3. self.__size = size
  4. self.__item = [None]*size
  5. self.__length = 0
  6. def __setitem__(self,key,value):
  7. self.__item[key] = value
  8. self.__length += 1
  9. def __getitem__(self, index):
  10. return self.__item[index]
  11. def __len__(self):
  12. return self.__length
  13. def __iter__(self):
  14. for value in self.__item:
  15. yield value
  16. class Linear_Queue():
  17. def __init__(self,size=4):
  18. self.size = size
  19. self.items = Array(size)
  20. self.head = 0
  21. self.end = 0
  22. def push(self,value):
  23. self.items[self.head % self.size] = value
  24. self.head += 1
  25. def pop(self):
  26. temp = self.items[self.end % self.size]
  27. self.end += 1
  28. return temp
  29. if __name__ == '__main__':
  30. lq = Linear_Queue()
  31. lq.push(11)
  32. lq.push(12)
  33. lq.push(13)
  34. lq.push(14)
  35. print(lq.pop())
  36. print(lq.pop())
  37. print(lq.pop())
  38. print(lq.pop())

2.链式队列

链式队列就是链表+队列性质组成的数据结构

代码实现

  1. class Node():
  2. def __init__(self,value=None,prev=None,next=None):
  3. self.value = value
  4. self.next = next
  5. self.prev = prev
  6. def __str__(self):
  7. return "Node:{}".format(self.value)
  8. class DoubleLinkedList():
  9. def __init__(self):
  10. self.size = 0
  11. self.root = Node()
  12. self.end = None
  13. def append(self,value):
  14. node = Node(value=value)
  15. #无节点
  16. if not self.end:
  17. self.root.next = node # root节点指向新节点
  18. node.prev = self.root#新节点指向根节点
  19. self.end = node#末节点指针指向新节点
  20. #有节点
  21. else:
  22. self.end.next = node#末节点指向新节点
  23. node.prev = self.end # 新节点指向末节点
  24. self.end = node#末节点移动到新节点
  25. self.size += 1
  26. def append_first(self,value):
  27. node = Node(value=value)
  28. #无节点
  29. if not self.end:
  30. self.root.next = node # root节点指向新节点
  31. node.prev = self.root # 新节点指向根节点
  32. self.end = node # 末节点指针指向新节点
  33. else:
  34. node.prev = self.root#新节点指向根节点
  35. temp = self.root.next#保存原来的第一个节点
  36. self.root.next = node#将新节点替换为第一个节点
  37. node.next = temp#让新节点的下一个节点为原来的第一个节点
  38. temp.prev = node#将原来的第一个节点的上一个节点设置为新节点
  39. self.size += 1
  40. def __iter__(self):
  41. current = self.root.next
  42. if current:
  43. while current is not self.end:
  44. yield current
  45. current = current.next
  46. return current
  47. else:
  48. print("LinkedList is empty")
  49. #逆向迭代
  50. def inverse_iter(self):
  51. current = self.end
  52. if current:
  53. while current is not self.root:
  54. yield current
  55. current = current.prev
  56. else:
  57. print("LinkedList is empty")
  58. def find(self,value):
  59. pass
  60. def find_count(self,value):
  61. pass
  62. def remove_first(self):
  63. if self.end:
  64. temp = self.root.next
  65. self.root.next = temp.next
  66. if temp.next:
  67. temp.next.prev = self.root
  68. return temp
  69. def remove_all(self,value):
  70. pass
  71. class Queue():
  72. def __init__(self,size=4):
  73. self.items = DoubleLinkedList()
  74. self.size = size
  75. self.length = 0
  76. def push(self,value):
  77. self.items.append(value)
  78. self.size += 1
  79. def pop(self):
  80. if self.length <= 0:
  81. return
  82. self.length -= 1
  83. return self.items.remove_first()
  84. def empty(self):
  85. pass

二,栈 

1.双端队列

  1. from collections import deque
  2. # 初始化队列
  3. queue = deque()
  4. # 入队操作
  5. queue.append(1)
  6. queue.append(2)
  7. queue.append(3)
  8. print("初始队列:", queue)
  9. # 出队操作
  10. print("出队元素:", queue.popleft()) # 输出并移除队首元素
  11. print("出队后队列:", queue)
  12. # 再次入队
  13. queue.append(4)
  14. # 查看队列状态
  15. print("当前队列:", queue)
  16. print("队列长度:", len(queue))

根据双端队列的性质可以模仿出栈的效果(先进后出),其实就是 

  1. from collections import deque
  2. d = deque([1,2,3,4])
  3. print(d.pop())
  4. print(d.pop())
  5. print(d.pop())
  6. print(d.pop())

输出结果: 4 3 2 1

这就类似栈的性质,但是这里只是用双端了队列模拟的。 

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

闽ICP备14008679号