implementación del lenguaje C de la cola circular

Una cola circular es Cola la última posición del espacio de memoria en torno a la primera posición, un espacio anular se forma en la cola de la lógica para el reciclaje. En la estructura de cola circular, cuando el espacio de la última posición de memoria se ha utilizado para entrar y operación de re-equipo, sólo la primera posición de espacio de almacenamiento gratuito, será un elemento añadido a la primera posición, el próximo espacio de almacenamiento la primera posición como la cola. colas circular puede ser más fácil de prevenir la aparición de la pseudo-desbordamiento, pero el tamaño de la cola es fijo.

 

En la cola circular, cuando la cola está vacía, hay delante = trasero, cuando todo el espacio de cola llena por completo, hay delante = trasera.

Para distinguir entre estos dos casos, puede tener hasta una cola ciclo predeterminado MaxSize-1 elementos de la cola, cuando la cola circular sólo una célula de memoria ficticia, la cola ya está lleno.

Por lo tanto, la cola de condición vacía se juzga frente = parte trasera, y la condición completa cola se juzga frente = (trasera + 1)% MaxSize.

 

Código de ejemplo:



#include "pch.h"
#include <stdio.h>

#define MAX_SIZE 10

//队列结构体
typedef struct {

	int front;
	int rear;
	int val[MAX_SIZE];
}strQueueType;

// 队列的初始化
void QueueInit(strQueueType *Sq)
{
	if (Sq != NULL)
	{
		Sq->front = 0;
		Sq->rear = 0;
	}
	else
	{
		printf("Initialize queue fail!\n");
	}
}

//判满
bool IsFull(strQueueType Sq)
{
	return (((Sq.rear + 1) % MAX_SIZE) == Sq.front);	
}

//判空
bool IsEmpty(strQueueType Sq)
{
	return (Sq.rear == Sq.front);
}
// 入队操作
void EnQueue(strQueueType *Sq, int dat)
{
	if (Sq != NULL)
	{
		//判断队列是否溢满
		if (IsFull(*Sq) != true)
		{
			Sq->val[Sq->rear] = dat;
			Sq->rear = (Sq->rear + 1) % MAX_SIZE;
		}
		else
		{
			printf("Queue is full!\n");
		}	
	}
	else
	{
		printf("Illegal varible!\n");
	}
}

//出队操作
void DeQueue(strQueueType *Sq, int *dat)
{
	if (Sq != NULL)
	{
		if (IsEmpty(*Sq) != true)
		{
			*dat = Sq->val[Sq->front];
			Sq->front = (Sq->front + 1) % MAX_SIZE;
		}
		else
		{
			printf("Queue is empty!\n");
		}	
	}
	else
	{
		printf("Illegal varible!\n");
	}
}

//打印队列信息
void display(strQueueType Sq)
{
	int i = 0;
	if (Sq.front <= Sq.rear)
	{
		for (i= Sq.front;i < Sq.rear; i++)
		{
			printf("%d\t", Sq.val[i]);
		}
		printf("\n");
	}
	else
	{
		for (i = Sq.front; i < MAX_SIZE; i++)
		{
			printf("%d\t", Sq.val[i]);
		}
		for (i = 0; i < Sq.rear; i++)
		{
			printf("%d\t", Sq.val[i]);
		}
		printf("\n");
	}
}

int main()
{
	strQueueType strQue;
	int i = 0;
	int buffer;

	QueueInit(&strQue);

	printf("Insert queue!\n");
	for (i = 0;i< 12;i++)
	{
		EnQueue(&strQue, i);
	}
	display(strQue);

	printf("Delete queue!\n");
	for (i = 0; i < 12; i++)
	{
		DeQueue(&strQue, &buffer);
	}
	display(strQue);

	printf("Insert queue again!\n");
	for (i = 0; i < 5; i++)
	{
		EnQueue(&strQue, i);
	}
	display(strQue);
}

 

Publicado cuatro artículos originales · ganado elogios 0 · Vistas 2677

Supongo que te gusta

Origin blog.csdn.net/wuyiwei999/article/details/99705449
Recomendado
Clasificación