队列--环形队列【数据结构】

队列:

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

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

队列--环形队列【数据结构】_第1张图片

环形队列的实现:

构成:

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 8
typedef 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 
#include 

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 = %d\n", Size(&q));
	printf("front = %d\n", Front(&q));
	printf("back = %d\n", Back(&q));
	QueuePop(&q);
	QueuePop(&q);
	QueuePop(&q);
	QueuePop(&q);
	QueuePrint(&q);
	printf("size = %d\n", Size(&q));
	printf("front = %d\n", Front(&q));
	printf("back = %d\n", Back(&q));
	QueuePush(&q, 8);
	QueuePush(&q, 9);
	QueuePush(&q, 10);
	QueuePush(&q, 11);
	QueuePush(&q, 12);
	printf("size = %d\n", Size(&q));
	printf("front = %d\n", Front(&q));
	printf("back = %d\n", Back(&q));
}





你可能感兴趣的:(数据结构【C语言】)