当前位置:   article > 正文

数据结构实验之队列(文末附完整代码)_数据结构判断队列是否为空代码

数据结构判断队列是否为空代码

目录

(1)队的定义

(2)队的基本操作:

 完整代码:

main.c部分:

 SeqQueue.c部分

SeqQueue.h部分


队列是一种线性数据结构,用于在程序中按照特定顺序组织和操作元素。它遵循先进先出(First-In-First-Out,FIFO)的原则,即最先进入队列的元素最先被处理,而最后进入的元素最后被处理。

队列可以类比为现实生活中的排队场景,人们按照到达的先后顺序排队等待服务。类似地,队列中的元素也按照顺序加入队列并离开队列。

队列有两个主要操作:

  1. 入队(enqueue):将元素添加到队列的尾部。
  2. 出队(dequeue):从队列的头部移除并返回元素。

这两个操作使得队列满足了先进先出的特性。新元素总是被添加到队列的末尾,而从队列中移除元素时,总是从队列的开头进行。

除了入队和出队操作之外,队列还可以提供其他一些常见的操作,如:

  • 获取队列的长度
  • 检查队列是否为空
  • 获取队列的头部元素,但不删除它

队列的应用非常广泛,例如:

  • 高级语言编译器中的编译错误消息队列
  • 操作系统中的进程调度
  • 网络通信中的数据包缓冲区
  • 广度优先搜索算法(BFS)
  • 银行柜台的客户排队等待服务

(1)队的定义

typedef int ElemType;//定义队列中元素类型

#define MAXSIZE 100 //定义队列初始存储空间大小

typedef struct SeqQueue  //定义队列结构

{

    ElemType *base; //队列存储空间基地址

    int front;  // 队列头

    int rear;  // 队列尾

    int size;  // 队列中元素数量

} SeqQueue;

这段代码定义了一个顺序队列(Sequential Queue)的数据结构。以下是对每个部分的解释:

  1. typedef int ElemType;:这段代码定义了队列中元素的类型为整数(int)。你可以根据需求将其修改为其他类型。

  2. #define MAXSIZE 100:这段代码定义了队列的初始存储空间大小,该队列最多可以容纳100个元素。你可以根据实际需要修改这个值。

  3. typedef struct SeqQueue:这是定义顺序队列的开始。

  4. ElemType *base:这是队列存储空间的基地址,它是一个指向元素类型(ElemType)的指针。

  5. int front:这是队列的头部指针,指向队列中第一个元素。

  6. int rear:这是队列的尾部指针,指向队列中最后一个元素的下一个位置。

  7. int size:这是队列中元素的数量。通过front和rear之间的位置关系可以计算得出。

 

(2)队的基本操作:

void initQueue(SeqQueue *s);//初始化队列

代码:

// 初始化队列

void initQueue(SeqQueue *q) {

    q->base=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);

    q->front=q->rear=0;

    q->size=0;

}

这个函数可以用来初始化一个队列。它会为队列分配一块存储空间,并将队列的头部指针、尾部指针和元素数量都设置为初始值,使得队列处于空的状态。你可以调用这个函数来初始化一个队列,然后就可以对这个队列进行入队和出队操作了 

bool isQueueFull(SeqQueue *s);//判断队列是否已满

代码:

bool isQueueFull(SeqQueue *q) {

    if(q->size==MAXSIZE){

        return true;

    }

    else return false;

}

这段代码是一个函数,用于判断队列是否已满的函数。该函数接受一个指向 SeqQueue 结构的指针作为参数,并返回布尔值 (truefalse)。以下是对每行代码的解释:

bool isQueueFull(SeqQueue *q) 
 

这是函数的声明,它定义了一个名为 isQueueFull 的函数,该函数接受一个指向 SeqQueue 结构的指针作为参数,并返回布尔值 (truefalse)。

if(q->size==MAXSIZE);

这行代码判断队列中元素的数量 (size) 是否等于队列的最大容量 (MAXSIZE)。如果相等,表示队列已满,执行下面的代码块。

如果队列已满,返回 true

如果队列未满,返回 false

bool isQueueEmpty(SeqQueue *s);//判断队列是否为空

代码:

// 判断队列是否为空

bool isQueueEmpty(SeqQueue *q) {

    if(q->size==0){

        return true;

    }

    else return false;

}

 

用于判断队列是否为空的函数。以下是对代码的解释:

 
 

这是函数的声明,它定义了一个名为 isQueueEmpty 的函数,该函数接受一个指向 SeqQueue 结构的指针作为参数,并返回布尔值 (truefalse)。

 
 

这行代码判断队列中元素的数量 (size) 是否等于 0。如果相等,表示队列为空,执行下面的代码块。

 
 

如果队列为空,返回 true

 
 

如果队列不为空,返回 false

void enqueue(SeqQueue *s,ElemType x);//入队

代码:

// 入队操作

void enqueue(SeqQueue *q, ElemType item) {

q->base[q->rear++]=item;

q->size++;

该函数接受一个指向 SeqQueue 结构的指针 q 和一个要入队的元素 item。它将元素 item 存储在队列的 rear 所指向的位置,并将队列的 rear 值加一。然后,它将队列中元素的数量 size 加一表示队列长度增加了一个元素。

这个函数用于往队列中添加元素,实现了队列的入队操作。调用这个函数可以将指定元素添加到队列的末尾。

 

ElemType dequeue(SeqQueue *s);//出队

代码:

// 出队操作

ElemType dequeue(SeqQueue *q) {

q->base[q->front++]=0;

q->size--;

    return 0;

}

该函数接受一个指向 SeqQueue 结构的指针 q。它将队列中的元素移除,实现了出队操作。这里的实现方式并不严格符合队列的操作规定,因为这个函数没有返回出队元素的值,而是直接返回了 0。正确的做法应该是在函数体内将出队元素的值返回。

具体来说,这个函数将队列中头元素(即下标为 front 的元素)置为 0,并将队列的 front 值加一表示头指针向后移动了一位。然后,它将队列中元素的数量 size 减一表示队列长度减少了一个元素。

这个函数用于从队列中移除元素,实现了队列的出队操作。调用这个函数可以将队列中的头元素移除。

ElemType getFront(SeqQueue *s); //获得队头元素

代码:

// 获取队列头元素

ElemType getFront(SeqQueue *q) {

    return q->base[q->front];

}

这个函数接受一个指向 SeqQueue 结构的指针 q。它返回队列头部元素的值,即队列中下标为 front 的位置上的元素。

通过调用这个函数,你可以获取到队列的头部元素,而不进行出队操作。这个函数不改变队列的状态,只返回队列头部元素的值。

ElemType getRear(SeqQueue *s); //获得队尾元素

代码:

// 获取队列尾元素

ElemType getRear(SeqQueue *q) {

    return q->base[q->rear-1];

}

这个函数接受一个指向 SeqQueue 结构的指针 q。它返回队列尾部元素的值,即队列中下标为 rear-1 的位置上的元素。

通过调用这个函数,你可以获取到队列的尾部元素,而不进行出队操作。这个函数不改变队列的状态,只返回队列尾部元素的值。

void destroyQueue(SeqQueue *s);//销毁队列

代码:

void destroyQueue(SeqQueue *q) {

    q->size=0;

    q->front=q->rear=0;

}

该函数接受一个指向 SeqQueue 结构的指针 q。它用于销毁队列,将队列恢复到初始状态。

具体来说,这个函数将队列中元素的数量 size、头指针 front 和尾指针 rear 都设置为 0,表示队列为空,没有任何元素。

通过调用这个函数,你可以销毁队列及其内部的数据结构,并释放相关的内存资源。注意,这段代码只是将队列状态重置,实际的内存释放工作可能需要在外部进行。

 

 完整代码:

main.c部分:

  1. #include "SeqQueue.h"
  2. int main()
  3. {
  4. /* SeqQueue q0; SeqQueue q1; SeqQueue q2;
  5. initQueue(&q0);initQueue(&q1);initQueue(&q2);*/
  6. SeqQueue q;
  7. initQueue(&q);
  8. if(isQueueFull(&q)){
  9. printf("队列已满!\n");
  10. }
  11. else printf("队列未满!\n");
  12. if(isQueueEmpty(&q)){
  13. printf("队列空\n");
  14. }
  15. else printf("队列不空\n");
  16. int n;
  17. printf("输入要入队的n个元素:\n");
  18. scanf("%d",&n);
  19. for(int i=0;i<n;i++)
  20. {
  21. int item;
  22. scanf("%d",&item);
  23. enqueue(&q, item);
  24. }
  25. printf("输入要出队的n个元素:\n");
  26. scanf("%d",&n);
  27. for(int i=0;i<n;i++)
  28. {
  29. dequeue(&q);
  30. }
  31. printf("队头元素为:%d\n",getFront(&q));
  32. printf("队尾元素为:%d\n",getRear(&q));
  33. /*char k[101],l;
  34. gets(k);
  35. l=strlen(k);
  36. for(int i=0;i<l;i++)
  37. {
  38. if(k[i]=='{')
  39. {
  40. enqueue(&q0, k[i]);
  41. }
  42. else if(k[i]=='(')
  43. {
  44. enqueue(&q1, k[i]);
  45. }
  46. else if(k[i]=='[')
  47. {
  48. enqueue(&q2, k[i]);
  49. }
  50. else if(!isQueueEmpty(&q0)&&k[i]=='}'){
  51. dequeue(&q0);
  52. }
  53. else if(!isQueueEmpty(&q1)&&k[i]==')'){
  54. dequeue(&q1);
  55. }
  56. else if(!isQueueEmpty(&q2)&&k[i]==']'){
  57. dequeue(&q2);
  58. }
  59. else if(isQueueEmpty(&q0)&&k[i]=='}'){
  60. printf("括号序列错误!\n");return 0;
  61. }
  62. else if(isQueueEmpty(&q1)&&k[i]==')'){
  63. printf("括号序列错误!\n");return 0;
  64. }
  65. else if(isQueueEmpty(&q2)&&k[i]==']'){
  66. printf("括号序列错误!\n");return 0;
  67. }
  68. }
  69. if(isQueueEmpty(&q0)&&isQueueEmpty(&q1)&&isQueueEmpty(&q2))
  70. {
  71. printf("括号序列正确!\n");
  72. }
  73. else {
  74. printf("括号序列错误!\n");
  75. }
  76. destroyQueue(&q0);destroyQueue(&q1);destroyQueue(&q2);*/
  77. return 0;
  78. }

 SeqQueue.c部分

  1. #include "SeqQueue.h"
  2. // 初始化队列
  3. void initQueue(SeqQueue *q) {
  4. q->base=(QElemType *)malloc(sizeof(QElemType)*MAXSIZE);
  5. q->front=q->rear=0;
  6. q->size=0;
  7. }
  8. // 判断队列是否已满
  9. bool isQueueFull(SeqQueue *q) {
  10. if(q->size==MAXSIZE){
  11. return true;
  12. }
  13. else return false;
  14. }
  15. // 判断队列是否为空
  16. bool isQueueEmpty(SeqQueue *q) {
  17. if(q->size==0){
  18. return true;
  19. }
  20. else return false;
  21. }
  22. // 入队操作
  23. void enqueue(SeqQueue *q, QElemType item) {
  24. q->base[q->rear++]=item;
  25. q->size++;
  26. }
  27. // 出队操作
  28. QElemType dequeue(SeqQueue *q) {
  29. q->base[q->front++]=0;
  30. q->size--;
  31. return 0;
  32. }
  33. // 获取队列头元素
  34. QElemType getFront(SeqQueue *q) {
  35. return q->base[q->front];
  36. }
  37. // 获取队列尾元素
  38. QElemType getRear(SeqQueue *q) {
  39. return q->base[q->rear-1];
  40. }
  41. void destroyQueue(SeqQueue *q) {
  42. q->size=0;
  43. q->front=q->rear=0;
  44. }

SeqQueue.h部分

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <assert.h>
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6. typedef char QElemType;//定义栈中元素类型
  7. #define MAXSIZE 100 //定义顺序栈初始存储空间大小
  8. typedef struct SeqQueue //定义栈结构
  9. {
  10. QElemType *base; //顺序栈存储空间基地址
  11. int front; // 队列头
  12. int rear; // 队列尾
  13. int size; // 队列中元素数量
  14. } SeqQueue;
  15. void initQueue(SeqQueue *s);//初始化队列
  16. bool isQueueFull(SeqQueue *s);//判断队列是否已满
  17. bool isQueueEmpty(SeqQueue *s);//判断队列是否为空
  18. void enqueue(SeqQueue *s,QElemType x);//入队
  19. QElemType dequeue(SeqQueue *s);//出队
  20. QElemType getFront(SeqQueue *s); //获得队头元素
  21. QElemType getRear(SeqQueue *s); //获得队尾元素
  22. void destroyQueue(SeqQueue *s);//销毁队列

感谢大家观看,有疑问评论区留言哈,感谢大家动动小手点个赞哦!!!

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

闽ICP备14008679号