当前位置:   article > 正文

数据结构––队列

数据结构––队列

1.队列的定义

2.队列的分类

2.1循环队

2.2链式队

3.队列的实现

3.1循环队

3.1.1声明

  1. typedef int QDataType;
  2. #define MAXSIZE 50 //定义元素的最大个数
  3. /*循环队列的顺序存储结构*/
  4. typedef struct {
  5. QDataType *data;
  6. int front; //头指针
  7. int rear; //尾指针
  8. }Queue;

3.1.2初始化

  1. void QueueInit(Queue* q)
  2. {
  3. q->data = (QDataType*)malloc(sizeof(QDataType )* MAXSIZE);
  4. if (q->data == NULL)
  5. {
  6. perror("malloc fail:");
  7. return;
  8. }
  9. q->front = 0;
  10. q->rear = 0;
  11. }

3.1.3判断队列是否为空

  1. bool QueueEmpty(Queue*q)
  2. {
  3. assert(q);
  4. return q->front == q->rear;
  5. }

3.1.4判断队列是否为满

  1. bool QueueFull(Queue*q)
  2. {
  3. assert(q);
  4. return q->front == (q->rear+1)%MAXSIZE;
  5. }

3.1.5入队

  1. void QueuePush(Queue* q, QDataType x)
  2. {
  3. assert(q);
  4. if(QueueFull)
  5. {
  6. printf("队列已满\n");
  7. return ;
  8. }
  9. q->data[q->rear] = x;
  10. q->rear = (q->rear + 1) % MAXSIZE; //rear指针向后移一位置,若到最后则转到数组头部
  11. }

3.1.6出队

  1. void QueuePop(Queue* q)
  2. {
  3. assert(q);
  4. assert(!QueueEmpty(q));
  5. q->front = (q->front + 1) % MAXSIZE; //front指针向后移一位置,若到最后则转到数组头部
  6. }

3.1.7打印队列

  1. void QueuePrint(Queue* q)
  2. {
  3. assert(q);
  4. int cur = q->front;
  5. printf("队头->");
  6. while (cur != q->rear)
  7. {
  8. printf("%d->", q->data[cur]);
  9. cur = (cur + 1) % MAXSIZE;
  10. }
  11. printf("队尾\n");
  12. }

3.1.8销毁队列

  1. void QueueDestroy(Deque* q)//销毁队列
  2. {
  3. assert(q);
  4. free(q->data);
  5. q->data = NULL;
  6. q->front = q->rear = 0;
  7. }

3.2链

3.2.1声明

  1. typedef int QDataType;
  2. typedef struct QueueNode
  3. {
  4. QDataType data;
  5. struct QueueNode* next;
  6. }QNode;
  7. typedef struct Queue
  8. {
  9. QNode* front;
  10. QNode* rear;
  11. size_t size;
  12. }Queue;

3.2.2初始化

  1. void QueueInit(Queue* q)
  2. {
  3. q->front = NULL;
  4. q->rear = NULL;
  5. q->size = 0;
  6. }

3.2.3判断队列是否为空

  1. bool QueueEmpty(Queue* q)
  2. {
  3. assert(q);
  4. return (q->front == NULL) && (q->rear == NULL);
  5. }
  1. void QueuePush(Queue* q, QDataType x)
  2. {
  3. assert(q);
  4. QNode* newnode = (QNode*)malloc(sizeof(QNode));
  5. newnode->data = x;
  6. newnode->next = NULL;
  7. if (newnode == NULL)
  8. {
  9. perror("malloc fail");
  10. return;
  11. }
  12. if (q->front == NULL)
  13. {
  14. q->front = q->rear = newnode;
  15. }
  16. else
  17. {
  18. q->rear->next = newnode;
  19. q->rear = newnode;
  20. }
  21. q->size++;
  22. }

3.2.4出队

  1. void QueuePop(Queue* q)
  2. {
  3. assert(q);
  4. assert(!QueueEmpty(q));
  5. //1.只有一个结点
  6. if (q->front == q->rear)
  7. {
  8. free(q->front);
  9. q->front = q->rear = NULL;
  10. }
  11. //2.有多个结点
  12. else
  13. {
  14. QNode* del = q->front;
  15. q->front = q->front->next;
  16. free(del);
  17. del = NULL;
  18. }
  19. q->size--;
  20. }

3.2.5打印队列

  1. void QueuePrint(Queue* q)
  2. {
  3. assert(q);
  4. QNode* cur = q->front;
  5. QNode* tail = q->rear;
  6. printf("队头->");
  7. while (cur != tail->next)
  8. {
  9. printf("%d->",cur->data);
  10. cur = cur->next;
  11. }
  12. printf("队尾\n");
  13. }

3.2.6销毁队列

  1. void QueueDestroy(Queue* q)
  2. {
  3. assert(q);
  4. QNode* cur = q->front;
  5. while (cur)
  6. {
  7. QNode* del = cur;
  8. cur = cur->next;
  9. free(del);
  10. del = NULL;
  11. }
  12. q->front = q->rear = NULL;
  13. }

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

闽ICP备14008679号