循環隊列的C語言實現

循環隊列就是將隊列存儲空間的最後一個位置繞到第一個位置,形成邏輯上的環狀空間,供隊列循環使用。在循環隊列結構中,當存儲空間的最後一個位置已被使用而再要進入隊運算時,只需要存儲空間的第一個位置空閒,便可將元素加入到第一個位置,即將存儲空間的第一個位置作爲隊尾。 循環隊列可以更簡單防止僞溢出的發生,但隊列大小是固定的。

 

在循環隊列中,當隊列爲空時,有front=rear,而當所有隊列空間全佔滿時,也有front=rear。

爲了區別這兩種情況,規定循環隊列最多只能有MaxSize-1個隊列元素,當循環隊列中只剩下一個空存儲單元時,隊列就已經滿了。

因此,隊列判空的條件是front=rear,而隊列判滿的條件是front=(rear+1)%MaxSize。

 

示例代碼:



#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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章