首页 > 编程知识 正文

数组 环形队列,循环队列是队列的什么结构

时间:2023-05-04 14:21:10 阅读:191066 作者:1119

队列:

1.只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表  
2.进行插入操作的一端称为队尾(入队列)  
3.进行删除操作的一端称为队头(出队列)  
4.队列具有先进先出(FIFO)的特性

由于顺序队列在操作上有诸多不便,(出队列时,要进行元素的搬移,效率低下,还会出现假溢出的问题)在此我们可以创建循环的顺序队列,即环形队列。


环形队列的实现:

构成:

typedef struct Queue{QDataType _array[MAX_SIZE];int _Front;//队列的头int _Back;//队列的尾int count;//队列中有效元素个数}Queue;

初始化:

void QueueInit(Queue* q){assert(q);q->_Front = q->_Back = 0;q->count = 0;}

入队列:

void QueuePush(Queue* q, QDataType data){assert(q);if (MAX_SIZE == q->count){printf("队列满!n");return;}q->_array[q->_Back++] = data;if (MAX_SIZE == q->_Back)q->_Back = 0;q->count++;}

出队列:

void QueuePop(Queue* q){assert(q);if (Empty(q)){printf("队列空!n");return;}q->_Front++;if (MAX_SIZE == q->_Front)//队头走到数组末尾,调整q->_Front = 0;q->count--;}

判空:

int Empty(Queue* q){return 0 == q->count;}

队列大小:

int Size(Queue *q){return q->count;}

队头元素:

QDataType Front(Queue* q){return q->_array[q->_Front];}

队尾元素:

QDataType Back(Queue* q){if (0 == q->_Back){return q->_array[MAX_SIZE - 1];}else{return q->_array[q->_Back - 1];}}完整代码:
queue.h

#pragma once#define MAX_SIZE 8typedef int QDataType;typedef struct Queue{QDataType _array[MAX_SIZE];int _Front;//队列的头int _Back;//队列的尾int count;//队列中有效元素个数}Queue;void TestQueue();void QueueInit(Queue *q); //初始化void QueuePush(Queue *q, QDataType data);//入队列void QueuePop(Queue *q);//出队列int Empty(Queue *q);//判空int Size(Queue *q);//队列大小QDataType Front(Queue *q);//队头元素QDataType Back(Queue *q);//队尾元素void QueuePrint(Queue *q);

queue.c

#define _CRT_SECURE_NO_WARNINGS 1#include"queue.h"//环形队列#include <stdio.h>#include <assert.h>void QueueInit(Queue* q){assert(q);q->_Front = q->_Back = 0;q->count = 0;}void QueuePush(Queue* q, QDataType data){assert(q);if (MAX_SIZE == q->count){printf("队列满!n");return;}q->_array[q->_Back++] = data;if (MAX_SIZE == q->_Back)q->_Back = 0;q->count++;}void QueuePop(Queue* q){assert(q);if (Empty(q)){printf("队列空!n");return;}q->_Front++;if (MAX_SIZE == q->_Front)//q->_Front = 0;q->count--;}int Empty(Queue* q){return 0 == q->count;}int Size(Queue *q){return q->count;}QDataType Front(Queue* q){return q->_array[q->_Front];}QDataType Back(Queue* q){if (0 == q->_Back){return q->_array[MAX_SIZE - 1];}else{return q->_array[q->_Back - 1];}}void QueuePrint(Queue *q){int i = q->_Front;for (; i < q->_Back; i++){printf("%d--", q->_array[i]);}printf("n");}void TestQueue(){Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);QueuePush(&q, 5);QueuePush(&q, 6);QueuePush(&q, 7);QueuePrint(&q);printf("size = %dn", Size(&q));printf("front = %dn", Front(&q));printf("back = %dn", Back(&q));QueuePop(&q);QueuePop(&q);QueuePop(&q);QueuePop(&q);QueuePrint(&q);printf("size = %dn", Size(&q));printf("front = %dn", Front(&q));printf("back = %dn", Back(&q));QueuePush(&q, 8);QueuePush(&q, 9);QueuePush(&q, 10);QueuePush(&q, 11);QueuePush(&q, 12);printf("size = %dn", Size(&q));printf("front = %dn", Front(&q));printf("back = %dn", Back(&q));}




版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。