当前位置:   article > 正文

队列重点操作代码集锦_队列出队代码

队列出队代码

目录

队列的介绍

链队列的重点操作

1.队列的创建和初始化

2.入队

3.出队

4.取队头元素

5.输出队列

6.全部操作代码

循环队列的重点操作

1.队列的创建和初始化

2.入队

3.出队

4.取队头元素

5.求队列长度

6.输出队列

7.全部操作代码

队列的应用

1.编写一个打印二项式系数表(即杨辉三角)

2.运动会划分子集问题

队列的介绍

队列(Queue)是一种先进先出(FIFO,First-In-First-Out)的线性表。

在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为 rear)进行插入操作,在前端(称为 front)进行删除操作。

链队列的重点操作

1.队列的创建和初始化

  1. typedef struct {
  2. int data;
  3. struct QNode* next;
  4. }QNode;
  5. typedef struct {
  6. QNode* front;//队头指针
  7. QNode* rear;//队尾指针
  8. }LinkQueue;
  9. //初始化
  10. LinkQueue* InitQueue() {
  11. LinkQueue* Q = malloc(sizeof(LinkQueue));//生成队头队尾指针
  12. Q->front = (QNode*)malloc(sizeof(QNode));//生成新结点作为头结点,队头队尾指针指向该结点
  13. Q->rear = Q->front;
  14. Q->front->next = NULL;//头结点指针域置空
  15. return Q;
  16. }

2.入队

  1. //入队
  2. void EnQueue(LinkQueue* Q, int e) {
  3. QNode* p = malloc(sizeof(QNode));//生成新结点
  4. p->data = e;//新结点数据域置为e,指针域置空
  5. p->next = NULL;
  6. Q->rear->next = p;//新结点插入队尾
  7. Q->rear = p;//修改队尾指针
  8. }

3.出队

  1. //出队
  2. bool DeQueue(LinkQueue* Q, int* e) {
  3. //删除队头元素,用e返回其值
  4. if (Q->front == Q->rear) return false;//判断队列是否为空
  5. QNode* p = Q->front->next;//p指向队头元素
  6. *e = p->data;//e保存队头元素
  7. Q->front->next = p->next;//修改头结点指针域
  8. if (Q->rear == p) Q->rear = Q->front;//最后一个元素被删,队尾指针指向头结点
  9. free(p);//释放队头元素空间
  10. return true;
  11. }

4.取队头元素

  1. //取队头元素
  2. bool GetHead(LinkQueue* Q, int* e) {
  3. //返回队头元素,不修改队头指针
  4. if (Q->front == Q->rear) return false;//判断队列是否为空
  5. QNode* p = Q->front->next;
  6. *e = p->data;//用e返回队头元素值
  7. return true;
  8. }

5.输出队列

  1. //输出
  2. void print(LinkQueue* Q) {
  3. //前提为队不为空
  4. printf("(front) ");
  5. if (Q->front != Q->rear) {
  6. QNode* p = Q->front->next;
  7. while (p != NULL) {
  8. printf("%d ", p->data);
  9. p = p->next;
  10. }
  11. }
  12. printf("(rear)\n");
  13. }

6.全部操作代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>//使用bool类型的头文件
  4. typedef struct {
  5. int data;
  6. struct QNode* next;
  7. }QNode;
  8. typedef struct {
  9. QNode* front;//队头指针
  10. QNode* rear;//队尾指针
  11. }LinkQueue;
  12. //初始化
  13. LinkQueue* InitQueue() {
  14. LinkQueue* Q = malloc(sizeof(LinkQueue));//生成队头队尾指针
  15. Q->front = (QNode*)malloc(sizeof(QNode));//生成新结点作为头结点,队头队尾指针指向该结点
  16. Q->rear = Q->front;
  17. Q->front->next = NULL;//头结点指针域置空
  18. return Q;
  19. }
  20. //入队
  21. void EnQueue(LinkQueue* Q, int e) {
  22. QNode* p = malloc(sizeof(QNode));//生成新结点
  23. p->data = e;//新结点数据域置为e,指针域置空
  24. p->next = NULL;
  25. Q->rear->next = p;//新结点插入队尾
  26. Q->rear = p;//修改队尾指针
  27. }
  28. //出队
  29. bool DeQueue(LinkQueue* Q, int* e) {
  30. //删除队头元素,用e返回其值
  31. if (Q->front == Q->rear) return false;//判断队列是否为空
  32. QNode* p = Q->front->next;//p指向队头元素
  33. *e = p->data;//e保存队头元素
  34. Q->front->next = p->next;//修改头结点指针域
  35. if (Q->rear == p) Q->rear = Q->front;//最后一个元素被删,队尾指针指向头结点
  36. free(p);//释放队头元素空间
  37. return true;
  38. }
  39. //取队头元素
  40. bool GetHead(LinkQueue* Q, int* e) {
  41. //返回队头元素,不修改队头指针
  42. if (Q->front == Q->rear) return false;//判断队列是否为空
  43. QNode* p = Q->front->next;
  44. *e = p->data;//用e返回队头元素值
  45. return true;
  46. }
  47. //输出
  48. void print(LinkQueue* Q) {
  49. //前提为队不为空
  50. printf("(front) ");
  51. if (Q->front != Q->rear) {
  52. QNode* p = Q->front->next;
  53. while (p != NULL) {
  54. printf("%d ", p->data);
  55. p = p->next;
  56. }
  57. }
  58. printf("(rear)\n");
  59. }
  60. int main() {
  61. LinkQueue* Q = InitQueue();
  62. int i, n, e;
  63. scanf("%d", &n);
  64. for (i = 0; i < n; i++) {
  65. scanf("%d", &e);
  66. EnQueue(Q, e);
  67. }
  68. print(Q);
  69. DeQueue(Q, &e);
  70. printf("%d\n", e);
  71. print(Q);
  72. return 0;
  73. }

循环队列的重点操作

1.队列的创建和初始化

  1. typedef struct {
  2. int* base;//储存空间的基地址
  3. int front;//头指针
  4. int rear;//尾指针
  5. int maxsize;//队列最大长度
  6. }SqQueue;
  7. //初始化
  8. SqQueue* InitQueue(int size) {
  9. SqQueue* Q = malloc(sizeof(SqQueue));//先创建队列结构体指针
  10. Q->base = (int*)malloc(sizeof(int) * size);//为队列分配一个最大容量为size的数组空间
  11. //队列最大长度置为size,头指针尾指针置为0,队列为空
  12. Q->maxsize = size;
  13. Q->front = 0;
  14. Q->rear = 0;
  15. return Q;
  16. }

2.入队

  1. //入队
  2. bool EnQueue(SqQueue* Q, int e) {
  3. //插入e作为新队尾元素
  4. if ((Q->rear + 1) % Q->maxsize == Q->front) return false;//尾指针在循环意义上加1后等于头指针说明队满
  5. Q->base[Q->rear] = e;//将元素e插入队尾
  6. Q->rear = (Q->rear + 1) % Q->maxsize;//尾指针加1
  7. return true;
  8. }

3.出队

  1. //出队
  2. bool DeQueue(SqQueue* Q, int* e) {
  3. //删除队头元素,用e返回其值
  4. if (Q->front == Q->rear) return false;//队空
  5. *e = Q->base[Q->front];//用e保存队头元素
  6. Q->front = (Q->front + 1) % Q->maxsize;//头指针加1
  7. return true;
  8. }

4.取队头元素

  1. //取队头元素
  2. bool GetHead(SqQueue* Q, int* e) {
  3. //返回队头元素,不修改头指针
  4. if (Q->front == Q->rear) return false;//队空
  5. *e = Q->base[Q->front];
  6. return true;
  7. }

5.求队列长度

  1. //取队头元素
  2. bool GetHead(SqQueue* Q, int* e) {
  3. //返回队头元素,不修改头指针
  4. if (Q->front == Q->rear) return false;//队空
  5. *e = Q->base[Q->front];
  6. return true;
  7. }

6.输出队列

  1. //输出
  2. void print(SqQueue* Q) {
  3. printf("(front) ");
  4. int i;
  5. //跟遍历数组差不多,就是要通过模运算防止越界
  6. for (i = Q->front; i != Q->rear; i = (i + 1) % Q->maxsize) {
  7. printf("%d ", Q->base[i]);
  8. }
  9. printf("(rear)\n");
  10. }

7.全部操作代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. typedef struct {
  5. int* base;//储存空间的基地址
  6. int front;//头指针
  7. int rear;//尾指针
  8. int maxsize;//队列最大长度
  9. }SqQueue;
  10. //初始化
  11. SqQueue* InitQueue(int size) {
  12. SqQueue* Q = malloc(sizeof(SqQueue));//先创建队列结构体指针
  13. Q->base = (int*)malloc(sizeof(int) * size);//为队列分配一个最大容量为size的数组空间
  14. //队列最大长度置为size,头指针尾指针置为0,队列为空
  15. Q->maxsize = size;
  16. Q->front = 0;
  17. Q->rear = 0;
  18. return Q;
  19. }
  20. //输出
  21. void print(SqQueue* Q) {
  22. printf("(front) ");
  23. int i;
  24. //跟遍历数组差不多,就是要通过模运算防止越界
  25. for (i = Q->front; i != Q->rear; i = (i + 1) % Q->maxsize) {
  26. printf("%d ", Q->base[i]);
  27. }
  28. printf("(rear)\n");
  29. }
  30. //入队
  31. bool EnQueue(SqQueue* Q, int e) {
  32. //插入e作为新队尾元素
  33. if ((Q->rear + 1) % Q->maxsize == Q->front) return false;//尾指针在循环意义上加1后等于头指针说明队满
  34. Q->base[Q->rear] = e;//将元素e插入队尾
  35. Q->rear = (Q->rear + 1) % Q->maxsize;//尾指针加1
  36. return true;
  37. }
  38. //出队
  39. bool DeQueue(SqQueue* Q, int* e) {
  40. //删除队头元素,用e返回其值
  41. if (Q->front == Q->rear) return false;//队空
  42. *e = Q->base[Q->front];//用e保存队头元素
  43. Q->front = (Q->front + 1) % Q->maxsize;//头指针加1
  44. return true;
  45. }
  46. //取队头元素
  47. bool GetHead(SqQueue* Q, int* e) {
  48. //返回队头元素,不修改头指针
  49. if (Q->front == Q->rear) return false;//队空
  50. *e = Q->base[Q->front];
  51. return true;
  52. }
  53. //求队列长度
  54. int QueueLength(SqQueue* Q) {
  55. //返回队列元素个数
  56. return (Q->rear - Q->front + Q->maxsize) % Q->maxsize;
  57. }
  58. int main() {
  59. int i, n, e;
  60. SqQueue* Q = InitQueue(5);
  61. scanf("%d",&n);
  62. for (i = 0; i < n; i++) {
  63. scanf("%d", &e);
  64. EnQueue(Q, e);
  65. }
  66. print(Q);
  67. DeQueue(Q, &e);
  68. printf("e=%d\n", e);
  69. DeQueue(Q, &e);
  70. printf("e=%d\n", e);
  71. DeQueue(Q, &e);
  72. printf("e=%d\n", e);
  73. scanf("%d",&n);
  74. for (i = 0; i < n; i++) {
  75. scanf("%d", &e);
  76. EnQueue(Q, e);
  77. }
  78. print(Q);
  79. }

队列的应用

1.编写一个打印二项式系数表(即杨辉三角)

  1. #include<stdio.h>
  2. #include<stdbool.h>
  3. // 假设队列的结构体定义如下,根据需要进行调整
  4. #define MAXSIZE 100
  5. typedef struct {
  6. int data[MAXSIZE];
  7. int front;
  8. int rear;
  9. } SqQueue;
  10. // 初始化队列
  11. void InitQueue_Sq(SqQueue *Q, int size) {
  12. Q->front = Q->rear = 0;
  13. }
  14. // 入队
  15. bool EnQueue_Sq(SqQueue *Q, int x) {
  16. if ((Q->rear + 1) % MAXSIZE == Q->front) {
  17. return false; // 队列已满
  18. }
  19. Q->data[Q->rear] = x;
  20. Q->rear = (Q->rear + 1) % MAXSIZE;
  21. return true;
  22. }
  23. // 出队
  24. bool DeQueue_Sq(SqQueue *Q, int *x) {
  25. if (Q->front == Q->rear) {
  26. return false; // 队列为空
  27. }
  28. *x = Q->data[Q->front];
  29. Q->front = (Q->front + 1) % MAXSIZE;
  30. return true;
  31. }
  32. // 获取队头元素
  33. bool GetHead_Sq(SqQueue *Q, int *x) {
  34. if (Q->front == Q->rear) {
  35. return false; // 队列为空
  36. }
  37. *x = Q->data[Q->front];
  38. return true;
  39. }
  40. // 判断队列是否为空
  41. bool QueueEmpty(SqQueue *Q) {
  42. return Q->front == Q->rear;
  43. }
  44. void Yanghui(int n) {
  45. SqQueue Q;
  46. int i, k, s, e;
  47. for(i=1;i<=n;i++){
  48. printf(" ");
  49. }
  50. printf("1\n");
  51. InitQueue_Sq(&Q, n + 2);
  52. EnQueue_Sq(&Q, 0);
  53. EnQueue_Sq(&Q, 1);
  54. EnQueue_Sq(&Q, 1);
  55. k = 1;
  56. while (k < n) {
  57. for (i = 1; i <= n - k; i++) {
  58. printf(" ");
  59. }
  60. EnQueue_Sq(&Q, 0);
  61. do {
  62. DeQueue_Sq(&Q, &s);
  63. GetHead_Sq(&Q, &e);
  64. if (e != 0) {
  65. printf("%d ", e);
  66. } else {
  67. printf("\n");
  68. }
  69. EnQueue_Sq(&Q, s + e);
  70. } while (e != 0);
  71. k++;
  72. }
  73. }
  74. int main() {
  75. Yanghui(5); // 打印5行的杨辉三角
  76. return 0;
  77. }

2.运动会划分子集问题

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MAXSIZE 10
  4. typedef struct SqQueue{
  5. int *base;// 队列元素
  6. int front;// 队首
  7. int rear;// 队尾
  8. }SqQueue;
  9. //队列的初始化
  10. void InitQueue(SqQueue *Q){
  11. Q->base = (int*)malloc(MAXSIZE *sizeof(int));
  12. if(Q->base == NULL){
  13. printf("内存分配失败");
  14. }
  15. Q->front = Q->rear = 0;
  16. }
  17. // 判断队列是否为空
  18. int IsEmpty(SqQueue q){
  19. if(q.rear == q.front){
  20. return 1;
  21. }
  22. return 0;
  23. }
  24. int IsFull(SqQueue q){
  25. if((q.rear+1)%MAXSIZE ==q.front){
  26. return 1;
  27. }
  28. return 0;
  29. }
  30. //队列元素的增加
  31. int EnQueue(SqQueue *q,int e){
  32. if((q->rear + 1)%MAXSIZE == q->front){
  33. return 0;
  34. }
  35. q->base[q->rear] = e;
  36. q->rear = (q->rear + 1)%MAXSIZE;
  37. return 1;
  38. }
  39. //队列元素的删除
  40. int DeQueue(SqQueue *q,int *x){
  41. if(q->front == q->rear){
  42. return 0;
  43. }
  44. *x = q->base[q->front];
  45. q->front = (q->front + 1)%MAXSIZE;
  46. return 1;
  47. }
  48. void PrintQueue(SqQueue q){
  49. int len = (q.rear-q.front+MAXSIZE)%MAXSIZE;
  50. int i,j;
  51. for(i = 0,j = q.front;i<len;i++,j = (j+1)%MAXSIZE){
  52. printf("%d ",q.base[j]);
  53. }
  54. }
  55. // 分类的实现
  56. void DivdeQueue(int R[][9]){
  57. int result[9] = {0};// 结果矩阵,存放分组结果
  58. int Group = 0;// 组号
  59. // 创建循环队列同时初始化
  60. SqQueue q;
  61. InitQueue(&q);
  62. // 将元素排入队列
  63. int i;
  64. for(i= 0;i<9;i++){
  65. EnQueue(&q,i);
  66. }
  67. int PreItem = q.rear;
  68. int CurItem;
  69. int newr[9] = {0};
  70. while(!IsEmpty(q)){
  71. Group += 1;
  72. for(i = 0;i<9;i++){
  73. newr[i] = R[q.base[q.front]][i];
  74. }
  75. while(q.front!=PreItem){
  76. DeQueue(&q,&CurItem);
  77. if(newr[CurItem]==0){
  78. result[CurItem] = Group;
  79. for(i = 0;i<9;i++){
  80. newr[i] += R[i][CurItem];
  81. }
  82. }else{
  83. EnQueue(&q,CurItem);
  84. }
  85. }
  86. PreItem = q.rear;
  87. }
  88. printf("开始输出结果");
  89. printf("\n");
  90. int p;
  91. for(p = 1;p<=Group;p++){
  92. int q;
  93. for(q = 0;q<9;q++){
  94. if(result[q]==p){
  95. printf("%d ",q+1);
  96. }
  97. }
  98. printf("\n");
  99. }
  100. }
  101. int main(){
  102. int R[9][9] = {
  103. 0,1,0,0,0,0,0,0,0,
  104. 1,0,0,0,1,1,0,1,1,
  105. 0,0,0,0,0,1,1,0,0,
  106. 0,0,0,0,1,0,0,0,1,
  107. 0,1,0,1,0,1,1,0,1,
  108. 0,1,1,0,1,0,1,0,0,
  109. 0,0,1,0,1,1,0,0,0,
  110. 0,1,0,0,0,0,0,0,0,
  111. 0,1,0,1,1,0,0,0,0
  112. };
  113. DivdeQueue(R);
  114. return 0;
  115. }
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号