当前位置:   article > 正文

数据结构 | 顺序队列_顺序队列的创建

顺序队列的创建

一、数据结构定义

  1. typedef int QueueType;
  2. typedef struct seqQueue {
  3. int MAXNUM; // 队列中能存放的最大元素个数
  4. int front, rear; // 队列的队首,队尾
  5. QueueType element[100]; // 存放连续空间的起始地址
  6. } *SeqQueue;

二、方法概览

  1. SeqQueue CreateSqlQueue(int maxNum); //创建空的顺序队列
  2. int IsQueueEmpty(SeqQueue Q); //判断顺序(环形)队列是否为空
  3. int IsQueueFull(SeqQueue Q); //判断顺序(环形)队列是否已满
  4. int EnQueue(SeqQueue Q, QueueType x); //入队
  5. QueueType DeQueue(SeqQueue Q); //出队
  6. QueueType GetQueueFront(SeqQueue Q); //取队首元素返回
  7. int DestroyQueue(SeqQueue Q); //销毁队列

三、方法详解

  1. // 创建空的顺序队列
  2. SeqQueue CreateSqlQueue(int maxNum) {
  3. SeqQueue queue = (SeqQueue)malloc(sizeof(struct seqQueue));
  4. if (!maxNum) return NULL;
  5. else {
  6. queue->MAXNUM = maxNum;
  7. queue->front = queue->rear = NULL;
  8. return queue;
  9. }
  10. }
  11. // 判断顺序(环形)队列是否为空
  12. int IsQueueEmpty(SeqQueue Q) {
  13. // 若为空,返回值为1,否则返回值为0
  14. // 若队列不存在,则返回-1
  15. if (Q == NULL) return -1;
  16. else return(Q->front == Q->rear);
  17. }
  18. // 判断顺序(环形)队列是否已满
  19. int IsQueueFull(SeqQueue Q) {
  20. // 若已满,返回值为1,否则返回值为0
  21. return((Q->rear + 1) % Q->MAXNUM == Q->front);
  22. }
  23. // 入队
  24. int EnQueue(SeqQueue Q, QueueType x) {
  25. // 若插入不成功,返回0;插入成功返回值为1
  26. if ((Q->rear + 1) % Q->MAXNUM == Q->front) return 0;
  27. else {
  28. Q->element[Q->rear] = x;
  29. Q->rear = (Q->rear + 1) % Q->MAXNUM;
  30. return 1;
  31. }
  32. }
  33. // 出队并返回删除元素
  34. QueueType DeQueue(SeqQueue Q) {
  35. // 若队列为空,则返回-1
  36. if (Q->front == Q->rear) return -1;
  37. else {
  38. int del = Q->element[Q->front];
  39. Q->front = (Q->front + 1) % Q->MAXNUM;
  40. return del;
  41. }
  42. }
  43. // 取队首元素返回
  44. QueueType GetQueueFront(SeqQueue Q){
  45. // 若队列为空,则返回-1
  46. if (Q->front == Q->rear) return -1;
  47. else return(Q->element[Q->front]);
  48. }
  49. // 销毁队列,释放队列所占存储空间
  50. int DestroyQueue(SeqQueue Q){
  51. // 返回销毁栈中现有数据元素的个数
  52. // 若待销毁的线性表不存在,则返回0
  53. if (Q->front == Q->rear) return 0;
  54. }

四、运行结果

         main方法代码如下:

  1. int main() {
  2. SeqQueue Q = CreateSqlQueue(10);
  3. if (IsQueueEmpty(Q)) printf("当前队列为空");
  4. for (int i = 0; i < 10; i++) {
  5. EnQueue(Q, i);
  6. }
  7. printf("\nDeQueue方法: ");
  8. for (int i = 0; i < 5; i++) {
  9. printf("%d ", DeQueue(Q));
  10. }
  11. printf("\nGetQueueFront方法: %d ", GetQueueFront(Q));
  12. DestroyQueue(Q);
  13. }

        运行结果如下:

         使用队列完成如下功能:

        设某银行有A、B两个业务窗口,A窗口处理业务的速度是B窗口的2倍,即A处理完2个业务,B才处理完一个。给定银行的顾客序列,请按业务完成顺序输出顾客序列。假定不考虑顾客到达的时间间隔,并且当A、B两个窗口同时处理完顾客时,A窗口的顾客先离开。
    输入一行整数,第一个数字是顾客的总数N(N<1000),后面跟N个整数代表顾客的编号,假定编号为奇数的顾客去A窗口处理业务,而编号为偶数的顾客去B窗口处理业务。

        测试输入:2  1  3  9   4  11  13  15
        预期输出:1  3  2  9  11  4  13  15

        代码如下:

  1. void QueueDemo(int a[], int n) {
  2. SeqQueue A = CreateSqlQueue(n * 2); //编号为奇数的顾客去A窗口
  3. SeqQueue B = CreateSqlQueue(n * 2); //编号为偶数的顾客去B窗口
  4. for (int i = 0; i < n; i++) {
  5. if (a[i] % 2) EnQueue(A, a[i]);
  6. else EnQueue(B, a[i]);
  7. }
  8. printf("结果如下:");
  9. while (1) {
  10. for (int i = 0; i < 2; i++) {
  11. if (!IsQueueEmpty(A)) {
  12. printf("%d ", GetQueueFront(A));
  13. DeQueue(A);
  14. }
  15. else break;
  16. }
  17. if (!IsQueueEmpty(B)) {
  18. printf("%d ", GetQueueFront(B));
  19. DeQueue(B);
  20. }
  21. else break;
  22. }
  23. }

         main方法代码如下:

  1. int main() {
  2. printf("\n\n队列案例:\n");
  3. int a[] = {2,1,3,9,4,11,13,15};
  4. QueueDemo(a, 8);
  5. }

        运行结果如下:

 

五、源代码

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. /* 顺序队列 */
  5. typedef int QueueType;
  6. typedef struct seqQueue {
  7. int MAXNUM; // 队列中能存放的最大元素个数
  8. int front, rear; // 队列的队首,队尾
  9. QueueType element[100]; // 存放连续空间的起始地址
  10. } *SeqQueue;
  11. SeqQueue CreateSqlQueue(int maxNum); //创建空的顺序队列
  12. int IsQueueEmpty(SeqQueue Q); //判断顺序(环形)队列是否为空
  13. int IsQueueFull(SeqQueue Q); //判断顺序(环形)队列是否已满
  14. int EnQueue(SeqQueue Q, QueueType x); //入队
  15. QueueType DeQueue(SeqQueue Q); //出队
  16. QueueType GetQueueFront(SeqQueue Q); //取队首元素返回
  17. int DestroyQueue(SeqQueue Q); //销毁队列
  18. // 创建空的顺序队列
  19. SeqQueue CreateSqlQueue(int maxNum) {
  20. SeqQueue queue = (SeqQueue)malloc(sizeof(struct seqQueue));
  21. if (!maxNum) return NULL;
  22. else {
  23. queue->MAXNUM = maxNum;
  24. queue->front = queue->rear = NULL;
  25. return queue;
  26. }
  27. }
  28. // 判断顺序(环形)队列是否为空
  29. int IsQueueEmpty(SeqQueue Q) {
  30. // 若为空,返回值为1,否则返回值为0
  31. // 若队列不存在,则返回-1
  32. if (Q == NULL) return -1;
  33. else return(Q->front == Q->rear);
  34. }
  35. // 判断顺序(环形)队列是否已满
  36. int IsQueueFull(SeqQueue Q) {
  37. // 若已满,返回值为1,否则返回值为0
  38. return((Q->rear + 1) % Q->MAXNUM == Q->front);
  39. }
  40. // 入队
  41. int EnQueue(SeqQueue Q, QueueType x) {
  42. // 若插入不成功,返回0;插入成功返回值为1
  43. if ((Q->rear + 1) % Q->MAXNUM == Q->front) return 0;
  44. else {
  45. Q->element[Q->rear] = x;
  46. Q->rear = (Q->rear + 1) % Q->MAXNUM;
  47. return 1;
  48. }
  49. }
  50. // 出队并返回删除元素
  51. QueueType DeQueue(SeqQueue Q) {
  52. // 若队列为空,则返回-1
  53. if (Q->front == Q->rear) return -1;
  54. else {
  55. int del = Q->element[Q->front];
  56. Q->front = (Q->front + 1) % Q->MAXNUM;
  57. return del;
  58. }
  59. }
  60. // 取队首元素返回
  61. QueueType GetQueueFront(SeqQueue Q){
  62. // 若队列为空,则返回-1
  63. if (Q->front == Q->rear) return -1;
  64. else return(Q->element[Q->front]);
  65. }
  66. // 销毁队列,释放队列所占存储空间
  67. int DestroyQueue(SeqQueue Q){
  68. // 返回销毁栈中现有数据元素的个数
  69. // 若待销毁的线性表不存在,则返回0
  70. if (Q->front == Q->rear) return 0;
  71. }
  72. /* 设某银行有A、B两个业务窗口,A窗口处理业务的速度是B窗口的2倍,即A处理完2个业务,B才处理完一个。
  73. 给定银行的顾客序列,请按业务完成顺序输出顾客序列。假定不考虑顾客到达的时间间隔,并且当A、B两个窗口同
  74. 时处理完顾客时,A窗口的顾客先离开。
  75. 输入一行整数,第一个数字是顾客的总数N(N<1000),后面跟N个整数代表顾客的编号,假定编号为奇数的顾
  76. 客去A窗口处理业务,而编号为偶数的顾客去B窗口处理业务。 */
  77. /*
  78. 测试输入:8 2 1 3 9 4 11 13 15
  79. 预期输出:1 3 2 9 11 4 13 15
  80. */
  81. void QueueDemo(int a[], int n) {
  82. SeqQueue A = CreateSqlQueue(n * 2); //编号为奇数的顾客去A窗口
  83. SeqQueue B = CreateSqlQueue(n * 2); //编号为偶数的顾客去B窗口
  84. for (int i = 0; i < n; i++) {
  85. if (a[i] % 2) EnQueue(A, a[i]);
  86. else EnQueue(B, a[i]);
  87. }
  88. printf("结果如下:");
  89. while (1) {
  90. for (int i = 0; i < 2; i++) {
  91. if (!IsQueueEmpty(A)) {
  92. printf("%d ", GetQueueFront(A));
  93. DeQueue(A);
  94. }
  95. else break;
  96. }
  97. if (!IsQueueEmpty(B)) {
  98. printf("%d ", GetQueueFront(B));
  99. DeQueue(B);
  100. }
  101. else break;
  102. }
  103. }
  104. int main() {
  105. SeqQueue Q = CreateSqlQueue(10);
  106. if (IsQueueEmpty(Q)) printf("当前队列为空");
  107. for (int i = 0; i < 10; i++) {
  108. EnQueue(Q, i);
  109. }
  110. printf("\nDeQueue方法: ");
  111. for (int i = 0; i < 5; i++) {
  112. printf("%d ", DeQueue(Q));
  113. }
  114. printf("\nGetQueueFront方法: %d ", GetQueueFront(Q));
  115. DestroyQueue(Q);
  116. printf("\n\n队列案例:\n");
  117. int a[] = {2,1,3,9,4,11,13,15};
  118. QueueDemo(a, 8);
  119. }

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

闽ICP备14008679号