• 数据结构-----队列


    目录

    前言

    队列

    定义 

    队列的定义和操作方法

     队列节点的定义

     操作方式

     顺序表实现队列(C/C++代码)

    链表实现队列(C/C++代码)

    Python语言实现队列


    前言

            排队是我们日常生活中必不可少的一件事,去饭堂打饭的时候排队,上公交车的时候排队等等,那排队的原则就是先到先得,排在前面的人先打饭,同样的在数据结构当中,有一种数据结构类型叫队列,其性质跟排队是一模一样的,下面我们就一起来看看吧!

    队列

    定义 

            队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

            队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表

     

    队列可以通过顺序表实现和链表实现,下面就一起来看看吧!  

    队列的定义和操作方法

     队列节点的定义

    顺序表:

    1. //队列定义
    2. typedef struct queue {
    3. ElemType data[Maxsize];
    4. int front;//指向队头
    5. int rear;//指向队尾
    6. }Queue;

    链式:

    1. //定义队列
    2. typedef struct queue {
    3. int count; //计数
    4. Node* front;//指向队头指针
    5. Node* rear;//指向队尾指针
    6. }Queue;

     操作方式

    1. void Queue_init(Queue* queue);//初始化
    2. bool isEmpty(Queue* queue);//判空
    3. bool isFull(Queue* queue);//判满
    4. void enQueue(Queue* queue, ElemType data);//入队
    5. Node* deQueue(Queue* queue);//出队
    6. int get_length(Queue* queue);//获取长度
    7. void travel_Queue(Queue* queue);//遍历(队头到队尾)
    8. void clear_Queue(Queue* queue);//清空销毁

     顺序表实现队列(C/C++代码)

    1. #include
    2. #include
    3. #define Maxsize 20 //最大容量
    4. //顺序表队列
    5. //节点数据
    6. typedef struct data {
    7. int num;
    8. char name[10];
    9. }ElemType;
    10. //队列定义
    11. typedef struct queue {
    12. ElemType data[Maxsize];
    13. int front;//指向队头
    14. int rear;//指向队尾
    15. }Queue;
    16. //初始化
    17. void queue_init(Queue* queue) {
    18. queue->front = 0;
    19. queue->rear = 0;
    20. }
    21. //判断是否满队列
    22. bool isFull(Queue* queue) {
    23. if (queue->rear == Maxsize) {
    24. printf("The queue is full\n");
    25. return true;
    26. }
    27. return false;
    28. }
    29. //判断是否空队列
    30. bool isEmpty(Queue* queue) {
    31. if (queue->rear == 0) {
    32. printf("The queue is etmpy\n");
    33. return true;
    34. }
    35. return false;
    36. }
    37. //入队操作
    38. void enQueue(Queue* queue, ElemType data) {
    39. if (!isFull(queue)) {
    40. //赋值
    41. queue->data[queue->rear].num = data.num;
    42. strcpy(queue->data[queue->rear].name, data.name);
    43. queue->rear++; //队尾+1,往后移动一位
    44. }
    45. else
    46. printf("error\n");
    47. }
    48. //出队操作
    49. ElemType deQueue(Queue* queue) {
    50. ElemType de_data = { 0 };
    51. if (!isFull(queue)) {
    52. de_data = queue->data[queue->front];
    53. queue->front++; //队头+1往后移动一位
    54. return de_data;
    55. }
    56. else
    57. printf("error\n");
    58. }
    59. //遍历队列(从队头开始到队尾)
    60. void travel_Queue(Queue* queue) {
    61. for (int i = queue->front; i < queue->rear; i++) {
    62. printf("%d %s\n", queue->data[i].num, queue->data[i].name);
    63. }
    64. printf("printf over!\n");
    65. }
    66. //获取队列长度
    67. int get_Queuelength(Queue* queue) {
    68. return queue->rear-queue->front;
    69. }
    70. //清空队列
    71. void clear_Queue(Queue* queue) {
    72. queue_init(queue);//直接恢复出厂设置
    73. }
    74. int main(void)
    75. {
    76. Queue queue;
    77. queue_init(&queue);
    78. ElemType data[4] = { {15,"fuck"},{16,"wdf"},{17,"wtmc"},{18,"cnmb"} };
    79. for (int i = 0; i < 4;i++) {
    80. enQueue(&queue, data[i]);
    81. }
    82. deQueue(&queue);
    83. travel_Queue(&queue);
    84. }
    85. //16 wdf
    86. //17 wtmc
    87. //18 cnmb
    88. //printf over!

    链表实现队列(C/C++代码)

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define Maxsize 20
    7. typedef struct datatype {
    8. int num;
    9. char name[10];
    10. }ElemType;
    11. //定义节点
    12. typedef struct node {
    13. ElemType data;
    14. struct node* next;
    15. }Node;
    16. //定义队列
    17. typedef struct queue {
    18. int count; //计数
    19. Node* front;//指向队头指针
    20. Node* rear;//指向队尾指针
    21. }Queue;
    22. void Queue_init(Queue* queue);//初始化
    23. bool isEmpty(Queue* queue);//判空
    24. bool isFull(Queue* queue);//判满
    25. void enQueue(Queue* queue, ElemType data);//入队
    26. Node* deQueue(Queue* queue);//出队
    27. int get_length(Queue* queue);//获取长度
    28. void travel_Queue(Queue* queue);//遍历
    29. void clear_Queue(Queue* queue);//清空销毁
    30. int main()
    31. {
    32. Queue myqueue;
    33. Queue_init(&myqueue);
    34. ElemType data[4] = { {15,"a"},{16,"wb"},{17,"htt"},{18,"jk"} };
    35. for (int i = 0; i < 4; i++) {
    36. enQueue(&myqueue, data[i]);
    37. }
    38. deQueue(&myqueue);
    39. travel_Queue(&myqueue);
    40. }
    41. //16 wb
    42. //17 htt
    43. //18 jk
    44. //Printf over
    45. //初始化
    46. void Queue_init(Queue* queue) {
    47. assert(queue);
    48. queue->front = NULL;
    49. queue->rear = NULL;
    50. queue->count=0;
    51. }
    52. //创建节点
    53. Node* create_node(ElemType data) {
    54. Node* new_node = (Node*)malloc(sizeof(Node));
    55. if (new_node) {
    56. new_node->data = data;
    57. new_node->next = NULL;
    58. return new_node;
    59. }
    60. else
    61. {
    62. printf("ERRPR\n");
    63. }
    64. }
    65. //判断是否空队列
    66. bool isEmpty(Queue* queue) {
    67. assert(queue);
    68. if (queue->count == 0)
    69. {
    70. printf("The queue is etmpy\n");
    71. return true;
    72. }
    73. return false;
    74. }
    75. //判断是否满队列
    76. bool isFull(Queue* queue) {
    77. assert(queue);
    78. if (queue->count == Maxsize) {
    79. printf("The queue is full\n");
    80. return true;
    81. }
    82. return false;
    83. }
    84. //入队
    85. void enQueue(Queue* queue, ElemType data) {
    86. assert(queue);
    87. if (!isFull(queue)) {
    88. Node* new_node = create_node(data);
    89. //如果队尾指向空的时候,也就是队列为空时
    90. if (queue->rear == NULL) {
    91. queue->front = new_node;
    92. queue->rear = new_node;
    93. queue->count++;
    94. }
    95. //当队列不为空的时候
    96. else
    97. {
    98. queue->rear->next = new_node;
    99. queue->rear = new_node;
    100. queue->count++;
    101. }
    102. }
    103. else
    104. {
    105. printf("error\n");
    106. }
    107. }
    108. //出队
    109. Node* deQueue(Queue* queue) {
    110. assert(queue);
    111. if (!isEmpty(queue)) {
    112. Node* deNode = queue->front;
    113. queue->front = deNode->next;
    114. queue->count--;
    115. return deNode;
    116. }
    117. printf("error\n");
    118. return NULL;
    119. }
    120. //获取队列长度
    121. int get_length(Queue* queue) {
    122. assert(queue);
    123. return queue->count;
    124. }
    125. //遍历队列
    126. void travel_Queue(Queue* queue) {
    127. assert(queue);
    128. Node* cur = queue->front;
    129. while (cur) {
    130. printf("%d %s\n", cur->data.num, cur->data.name);
    131. cur = cur->next;
    132. }
    133. printf("Printf over\n");
    134. }
    135. //清空队列
    136. void clear_Queue(Queue* queue) {
    137. assert(queue);
    138. Node* cur = queue->front;
    139. while (cur) {
    140. //要把每一个节点的空间都释放,避免内存泄漏
    141. Node* p = cur->next; //获取到当前节点的下一个节点
    142. free(cur);
    143. cur = p;
    144. }
    145. printf("Clear successfully!\n");
    146. }

    Python语言实现队列

    链接:Python数据结构-----队列_python队列_灰勒塔德的博客-CSDN博客

     以上就是今天的全部内容了,我们下一期再见!!!

    分享一张壁纸:

  • 相关阅读:
    Verilog语言中case、casex、casez的用法和区别
    力扣题解(73. 矩阵置零),带注释
    项目实战-智慧监督下的合同预付款控制策略-物料价格下行-智慧监督-合同预付款预警推送大数据
    RabbitMQ消息队列常见面试题总结
    LX12864P1屏幕使用介绍(ST7567驱动),显示横线、字符、图形
    这些并发编程知识,一定要学会
    预处理查询和预处理DML
    CMakeLists编译前拷贝文件或目录
    Java 复习笔记 - 面向对象进阶篇
    HDU 3549 Flow Problem(最大流)
  • 原文地址:https://blog.csdn.net/m0_73633088/article/details/132996707