一、队列的介绍

  队列的定义:队列是一种特殊的线性表,只允许在表的头部(front处)进行删除操作,在表的尾部(rear处)进行插入操作的线性数据结构,这种结构就叫做队列。进行插入操作的一端称为队尾,进行删除操作的一端称为队尾。

  队列的类型:链式队列,即用链表实现的队列。静态队列:即用数组实现的队列。

  队列的特性:

    • 在队尾插入元素,在队首删除元素。
    • FIFO(先进先出),就向排队取票一样。

二、队列的python代码实现

  1. class Queue(object):
  2. def __init__(self):
  3. print("===创建队列===")
  4. self.element = []
  5.  
  6. def inQueue(self,num):
  7. self.element.append(num)
  8. print("%d进入队列"%num,end=" ")
  9.  
  10. def is_empty(self):
  11. if len(self.element)==0:
  12. return True
  13. else:
  14. return False
  15.  
  16. def outQueue(self):
  17. if self.is_empty()==True:
  18. print("你要删除的队列为空")
  19. return
  20. else:
  21. num = self.element[0]
  22. print("%d要出队列"%num,end=" ")
  23. self.element.pop(0)
  24.  
  25. def length(self):
  26. return len(self.element)
  27.  
  28. def travel(self):
  29. if self.is_empty()==True:
  30. print("你要遍历的队列为空")
  31. return
  32. else:
  33. print("你要遍历的队列元素有:",end=" ")
  34. for i in range(0,self.length()):
  35. print("%d "%self.element[i],end=" ")
  36. print("\n")
  37.  
  38. def main():
  39. q = Queue()
  40. print("===验证空队列===")
  41. q.travel()
  42. print("===往队列中添加数据===")
  43. q.inQueue(1)
  44. q.travel()
  45. q.inQueue(2)
  46. q.inQueue(3)
  47. q.inQueue(4)
  48. q.inQueue(5)
  49. q.travel()
  50. print("===验证出队列===")
  51. q.outQueue()
  52. q.travel()
  53. q.outQueue()
  54. q.travel()
  55.  
  56. if __name__ == '__main__':
  57. main()

运行结果为:

  1. ===创建队列===
  2. ===验证空队列===
  3. 你要遍历的队列为空
  4. ===往队列中添加数据===
  5. 1进入队列 你要遍历的队列元素有: 1
  6.  
  7. 2进入队列 3进入队列 4进入队列 5进入队列 你要遍历的队列元素有: 1 2 3 4 5
  8.  
  9. ===验证出队列===
  10. 1要出队列 你要遍历的队列元素有: 2 3 4 5
  11.  
  12. 2要出队列 你要遍历的队列元素有: 3 4 5

三、队列的C语言代码实现

  1. // main.m
  2. // 队列
  3. // Created by 侯垒 on 2019/7/3.
  4. // Copyright © 2019 可爱的侯老师. All rights reserved.
  5.  
  6. #include<stdio.h>
  7.  
  8. #define SIZE 20
  9. typedef struct Q
  10. {
  11. int array[SIZE];
  12. int front;
  13. int rear;
  14. int length;
  15. }Queue;
  16.  
  17. void createQueue(Queue *q)
  18. {
  19. q->front = ;
  20. q->rear = -;
  21. q->length = ;
  22. printf("创建队列成功\n");
  23. }
  24.  
  25. void inQueue(Queue *q,int num)
  26. {
  27. if (q->length >= SIZE)
  28. {
  29. printf("该队列已经满了\n");
  30. }
  31. else
  32. {
  33. q->rear = q->rear+;
  34. q->array[q->rear] = num;
  35. q->length++;
  36. printf("%d进入队列\n",num);
  37. }
  38. }
  39.  
  40. void outQueue(Queue *q)
  41. {
  42. if (q->length <= )
  43. {
  44. printf("这是一个空队列");
  45. }
  46. else
  47. {
  48. int num = q->array[q->front];
  49. printf("%d出队列 ",num);
  50. q->front = q->front+;
  51. q->length--;
  52. }
  53. }
  54.  
  55. void travel(Queue *q)
  56. {
  57. if (q->length <= )
  58. {
  59. printf("这是一个空队列\n");
  60. }
  61. else
  62. {
  63. printf("你遍历的队列里面的数据有:");
  64. for (int i=q->front; i<q->rear+; i++)
  65. {
  66. printf(" %d ",q->array[i]);
  67. }
  68. printf("\n");
  69. }
  70. }
  71.  
  72. int main(int argc, const char * argv[]) {
  73.  
  74. Queue q;
  75. createQueue(&q);
  76. travel(&q);
  77. inQueue(&q, );
  78. inQueue(&q, );
  79. inQueue(&q, );
  80. inQueue(&q, );
  81. inQueue(&q, );
  82. inQueue(&q, );
  83. travel(&q);
  84. outQueue(&q);
  85. travel(&q);
  86. outQueue(&q);
  87. travel(&q);
  88. outQueue(&q);
  89. travel(&q);
  90.  
  91. return ;
  92. }

运行结果为:

  1. 创建队列成功
  2. 这是一个空队列
  3. 1进入队列
  4. 2进入队列
  5. 3进入队列
  6. 4进入队列
  7. 5进入队列
  8. 6进入队列
  9. 你遍历的队列里面的数据有:
  10. 1出队列 你遍历的队列里面的数据有:
  11. 2出队列 你遍历的队列里面的数据有:
  12. 3出队列 你遍历的队列里面的数据有:

四、双端队列

双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。

双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。

  

双端队列的常用操作

  • Deque() 创建一个空的双端队列
  • add_front(item) 从队头加入一个item元素
  • add_rear(item) 从队尾加入一个item元素
  • remove_front() 从队头删除一个item元素
  • remove_rear() 从队尾删除一个item元素
  • is_empty() 判断双端队列是否为空
  • size() 返回队列的大小

五、双端队列的python代码实现

  1. class Deque(object):
  2. """双端队列"""
  3. def __init__(self):
  4. self.items = []
  5. print("初始化双端队列")
  6.  
  7. def is_empty(self):
  8. """判断队列是否为空"""
  9. return self.items == []
  10.  
  11. def add_front(self, item):
  12. """在队头添加元素"""
  13. print("%d在队首进入队列"%item)
  14. self.items.insert(0,item)
  15.  
  16. def add_rear(self, item):
  17. """在队尾添加元素"""
  18. print("%d在队尾进入队列"%item)
  19. self.items.append(item)
  20.  
  21. def remove_front(self):
  22. """从队头删除元素"""
  23. item = self.items[0]
  24. print("%d从队首出队列"%item)
  25. return self.items.pop(0)
  26.  
  27. def remove_rear(self):
  28. """从队尾删除元素"""
  29. print("%d从队尾出队列"%self.items[len(self.items)-1])
  30. return self.items.pop()
  31.  
  32. def size(self):
  33. """返回队列大小"""
  34. return len(self.items)
  35.  
  36. def travel(self):
  37. if len(self.items)==0:
  38. print("你要遍历的队列是空队列")
  39. else:
  40. print("你要遍历的队列元素有:",end=" ")
  41. for i in range(0,len(self.items)):
  42. print("%d "%self.items[i],end=" ")
  43. print("\n")
  44.  
  45. if __name__ == "__main__":
  46. deque = Deque()
  47. deque.add_front(1)
  48. deque.add_front(2)
  49. deque.add_rear(3)
  50. deque.add_rear(4)
  51. deque.travel()
  52. print("队列长度为:%d\n"%deque.size())
  53. deque.remove_front()
  54. deque.travel()
  55. deque.remove_front()
  56. deque.travel()
  57. deque.remove_rear()
  58. deque.travel()
  59. deque.remove_rear()
  60. deque.travel()

运行结果为:

  1. 初始化双端队列
  2. 1在队首进入队列
  3. 2在队首进入队列
  4. 3在队尾进入队列
  5. 4在队尾进入队列
  6. 你要遍历的队列元素有: 2 1 3 4
  7.  
  8. 队列长度为:4
  9.  
  10. 2从队首出队列
  11. 你要遍历的队列元素有: 1 3 4
  12.  
  13. 1从队首出队列
  14. 你要遍历的队列元素有: 3 4
  15.  
  16. 4从队尾出队列
  17. 你要遍历的队列元素有: 3
  18.  
  19. 3从队尾出队列
  20. 你要遍历的队列是空队列

六、双端队列的C语言代码实现

  1. // main.m
  2. // 双端队列
  3. // Created by 侯垒 on 2019/7/4.
  4. // Copyright © 2019 可爱的侯老师. All rights reserved.
  5. #include<stdio.h>
  6.  
  7. // 创建队列的节点结构体
  8. typedef struct N
  9. {
  10. int num;
  11. struct N *next;
  12. }Node;
  13.  
  14. // 创建节点
  15. Node * createNode(int num)
  16. {
  17.  
  18. Node *node = (Node *)malloc(sizeof(Node));
  19. node->num = num;
  20. node->next = NULL;
  21. return node;
  22. }
  23.  
  24. // 创建双端队列
  25. Node * createDeQue()
  26. {
  27. printf("初始化队列\n");
  28. Node *head = NULL;
  29. return head;
  30. }
  31.  
  32. // 判断是否为空
  33. int is_empty(Node *head)
  34. {
  35. if (head == NULL)
  36. {
  37. return ;
  38. }
  39. else
  40. {
  41. return ;
  42. }
  43. }
  44.  
  45. // 求双向队列的长度
  46. int length(Node *head)
  47. {
  48. Node *current = head;
  49. if (is_empty(head))
  50. {
  51. return ;
  52. }
  53. int count = ;
  54. while (current->next!=NULL)
  55. {
  56. count++;
  57. current = current->next;
  58. }
  59. return count;
  60. }
  61.  
  62. // 头部插入
  63. Node *add_front(Node *head, int num)
  64. {
  65. Node *node = createNode(num);
  66. Node *current = head;
  67. if (is_empty(head)==)
  68. {
  69. head = node;
  70. }
  71. else
  72. {
  73. node->next = head;
  74. head = node;
  75. }
  76. printf("%d从队列头部进入队列\n",num);
  77. return head;
  78. }
  79.  
  80. // 尾部插入
  81. Node *add_rear(Node *head,int num)
  82. {
  83. Node *node = createNode(num);
  84. if (is_empty(head)==)
  85. {
  86. head = add_front(head, num);
  87. }
  88. else
  89. {
  90. Node *current = head;
  91. while (current->next != NULL)
  92. {
  93. current = current->next;
  94. }
  95. current->next = node;
  96. }
  97. printf("%d从尾部进入队列\n",num);
  98. return head;
  99. }
  100.  
  101. // 头部删除
  102. Node *remove_front(Node *head)
  103. {
  104. if (is_empty(head) == )
  105. {
  106. printf("这是一个空队列");
  107. return head;
  108. }
  109. else
  110. {
  111.  
  112. int num = head->num;
  113. //head->next = head->next->next;
  114. printf("%d从队列头部出队列\n",num);
  115. head = head->next;
  116. return head;
  117. }
  118. }
  119.  
  120. // 尾部删除
  121. Node *remove_rear(Node *head)
  122. {
  123. if (is_empty(head) == )
  124. {
  125. printf("这是一个空队列");
  126. return head;
  127. }
  128. else if (length(head) == )
  129. {
  130. head = remove_front(head);
  131. return head;
  132. }
  133. else
  134. {
  135. Node *current = head;
  136. for (int i=; i<length(head)-; i++)
  137. {
  138. current = current->next;
  139. }
  140. printf("%d从队列尾部出队列\n",current->next->num);
  141. current->next = NULL;
  142. return head;
  143. }
  144. }
  145.  
  146. // 遍历
  147. void travel(Node *head)
  148. {
  149. if (is_empty(head) == )
  150. {
  151. printf("你遍历的队列为空\n");
  152. }
  153. else
  154. {
  155. printf("你要遍历的队列元素有:");
  156. Node *current = head;
  157. //printf("%d ",current->num);
  158. for (int i = ; i<length(head); i++)
  159. {
  160. printf("%d ",current->num);
  161. current = current->next;
  162. }
  163. printf("\n");
  164. }
  165. }
  166.  
  167. int main(int argc, const char * argv[])
  168. {
  169. Node *head = createDeQue();
  170. head = add_front(head, );
  171. travel(head);
  172. head = add_front(head, );
  173. travel(head);
  174. head = add_rear(head, );
  175. travel(head);
  176. head = add_rear(head, );
  177. travel(head);
  178.  
  179. int len = length(head);
  180. printf("现在队列的长度为%d\n",len);
  181.  
  182. head = remove_front(head);
  183. travel(head);
  184. head = remove_front(head);
  185. travel(head);
  186. len = length(head);
  187. printf("现在队列的长度为%d\n",len);
  188. head = remove_rear(head);
  189. travel(head);
  190. head = remove_rear(head);
  191. travel(head);
  192.  
  193. return ;
  194. }

运行结果为:

  1. 初始化队列
  2. 1从队列头部进入队列
  3. 你要遍历的队列元素有:
  4. 2从队列头部进入队列
  5. 你要遍历的队列元素有:
  6. 3从尾部进入队列
  7. 你要遍历的队列元素有:
  8. 4从尾部进入队列
  9. 你要遍历的队列元素有:
  10. 现在队列的长度为4
  11. 2从队列头部出队列
  12. 你要遍历的队列元素有:
  13. 1从队列头部出队列
  14. 你要遍历的队列元素有:
  15. 现在队列的长度为2
  16. 4从队列尾部出队列
  17. 你要遍历的队列元素有:
  18. 3从队列头部出队列
  19. 你遍历的队列为空

python算法与数据结构-队列(44)的更多相关文章

  1. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  2. python算法与数据结构-算法介绍(31)

    一.算法和数据结构 什么是算法和数据结构?如果将最终写好运行的程序比作战场,我们程序员便是指挥作战的将军,而我们所写的代码便是士兵和武器. 那么数据结构和算法是什么?答曰:兵法!故,数据结构和算法是一 ...

  3. 用go实现常用算法与数据结构——队列(queue)

    queue 简介 队列是一种非常常见的数据结构,日常生活中也能经常看到.一个典型的队列如下图(图片来自 segmentfault): 可以看出队列和我们日常生活中排队是基本一致的.都遵循 FIFO(F ...

  4. python算法与数据结构-单链表(38)

    一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括 ...

  5. python算法与数据结构-什么是数据结构

    一.什么是数据结构 数据结构,直白地理解,就是研究数据的存储方式. 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储 {1,2,3,4,5} 是为了后期取得它们的值 ...

  6. python算法与数据结构-栈(43)

    一.栈的介绍 栈作为一种数据结构,是一种只能在一端进行插入和删除操作.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读 ...

  7. python算法与数据结构-数据结构中常用树的介绍(45)

    一.树的定义 树是一种非线性的数据结构,是由n(n >=0)个结点组成的有限集合.如果n==0,树为空树.如果n>0,树有一个特定的结点,根结点根结点只有直接后继,没有直接前驱.除根结点以 ...

  8. python算法与数据结构-二叉树的代码实现(46)

    一.二叉树回忆 上一篇我们对数据结构中常用的树做了介绍,本篇博客主要以二叉树为例,讲解一下树的数据结构和代码实现.回顾二叉树:二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”(left ...

  9. TypeScript算法与数据结构-队列和循环队列

    本文涉及的源码,均在我的github.有两部分队列和循环队列.有问题的可以提个issue,看到后第一时间回复 1. 队列(Queue) 队列也是一种线性的数据结构, 队列是一种先进先出的数据结构.类似 ...

随机推荐

  1. WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能

    原文:WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能       对于CAD图形来说,3D旋转比较常用,具体实现方法在上篇文章<WPF中3D旋转的实现 >中做了 ...

  2. Asp.net MVC Razor输出字符串方法(js中嵌入razor)

    @{ Model p = new Model(); //输出名称和年龄 //1.第一种方式 @:姓名=@p.Name //2.第二中方式 <text>年龄=</text>p.A ...

  3. WPF加载等待动画

    原文:WPF加载等待动画 原文地址:https://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner 界面遮罩 <UserC ...

  4. Wrapped的返回值取值

    Bared   Wrapped   using Newtonsoft.Json; using Newtonsoft.Json.Linq; string str = JsonConvert.Serial ...

  5. qt 透明度设置(setWindowOpacity 和 setAutoFillBackground 和 带透明度的画刷填充就好了)

    1,父窗口透明// 设置背景图片 QPalette pa;setAutoFillBackground(true);pa.setBrush(QPalette::Background,QBrush(QPi ...

  6. WPF应用无法使用Snoop分析的解决办法

    如果WPF程序是以管理员身份启动的,Snoop不是用管理员身份启动,那就不行. 用管理员身份启动snoop,就可以了. 管理员身份启动cmd,然后启动snoop,ok.

  7. 在Winform窗体中使用WPF控件(附源码)

    原文:在Winform窗体中使用WPF控件(附源码) 今天是礼拜6,下雨,没有外出,闲暇就写一篇博文讲下如何在Winform中使用WPF控件.原有是我在百度上搜索相关信息无果,遂干脆动手自己实现. W ...

  8. Android零基础入门第1节:Android的前世今生

    原文:Android零基础入门第1节:Android的前世今生 现在网上有很多各色Android资料了,但相对来说还是比较零散,Android覆盖的范围极广,最近刚好有机会全部拉通整理一遍,也保存起来 ...

  9. duilib禁止標題欄雙擊放大窗口

    創建窗口函數中使用UI_WNDSTYLE_DIALOG CMainWnd *win = new CMainWnd(_T("main_win.xml")); win->Crea ...

  10. 【UWP开发】uwp应用安装失败

    原文:[UWP开发]uwp应用安装失败 编译出了uwp应用.appx之后双击打开,报错你需要为此应用包而安装的新证书,或者是带有受信任证书的新应用包.系统管理员或应用开发人员可以提供帮助.证书链在不受 ...