欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

循环队列的实现

程序员文章站 2022-07-14 14:01:40
...

Oqueue.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


typedef int DATATYPE;
typedef struct Oqueue
{
	DATATYPE* _arr;
	int _front;
	int _rear;
	int _capicity;
}Oqueue;

void OqueueInit(Oqueue* q, int k); 
int myCircularQueueEnQueue(Oqueue* q, int value);
void myCircularQueueDeQueue(Oqueue* q);
int myCircularQueueFront(Oqueue* q);
int myCircularQueueRear(Oqueue* q);
int myCircularQueueIsEmpty(Oqueue* q);
int myCircularQueueIsFull(Oqueue* q);
void myCircularQueuePrint(Oqueue* q);

Oqueue.c

#include"Oqueue.h"
void OqueueInit(Oqueue* q,int k)
{
	assert(q);
	
	q->_capicity = k;
	q->_front = 0;
	q->_rear = 0;
	q->_arr = (DATATYPE*)malloc((q->_capicity+1)*sizeof(DATATYPE));
}

int myCircularQueueEnQueue(Oqueue* q, int value)
{
	assert(q);
	static int xrear = 0;
	if (q->_capicity == 0)
	{
		return 0;
	}
	if (q->_rear == q->_capicity)       //如果满了,就从头开始覆盖的插,但是尾部还在arr[4]
	{                                //如果让q->rear便成了0,那么接下来的打印将没法实现,如容量为5,插入1、2、3、4、5、6、7,会打印6、7,我们要打印出6、7、3、4、5
		q->_arr[xrear % q->_capicity] = value;
		xrear++;
	}
	else
	q->_arr[q->_rear++] = value;
	return 1;
}

void myCircularQueueDeQueue(Oqueue* q)
{
	assert(q);
	if (q->_rear == 0)
	{
		return;
	}
	q->_rear--;
}

int myCircularQueueFront(Oqueue* q)
{
	assert(q);
	if (q->_rear == 0)
	{
		return -1;
	}
	return q->_arr[q->_front];
}

int myCircularQueueRear(Oqueue* q)
{
	assert(q);
	if (q->_rear == 0)
	{
		return -1;
	}
	return q->_arr[q->_rear];
}

int myCircularQueueIsEmpty(Oqueue* q)
{
	assert(q);
	if (q->_rear == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int myCircularQueueIsFull(Oqueue* q)
{
	assert(q);
	if (q->_rear == q->_capicity)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

void myCircularQueuePrint(Oqueue* q)
{
	assert(q);
	int i = 0;
	while (i != q->_rear)
	{
		printf("%d->",q->_arr[i]);
		i++;
	}
	printf("\n");
}

test.c

#include"Oqueue.h"
int main()
{
	Oqueue q;
	OqueueInit(&q, 5);
	myCircularQueueEnQueue(&q, 1);
	myCircularQueueEnQueue(&q, 2);
	myCircularQueueEnQueue(&q, 3);
	myCircularQueueEnQueue(&q, 4);
	myCircularQueueEnQueue(&q, 5);
	myCircularQueueEnQueue(&q, 6);
	myCircularQueueEnQueue(&q, 7);
	myCircularQueueEnQueue(&q, 8);
	myCircularQueueEnQueue(&q, 9);
	myCircularQueueEnQueue(&q, 10);
	myCircularQueueEnQueue(&q, 11);
	myCircularQueueEnQueue(&q, 12);
	myCircularQueueEnQueue(&q, 13);
	myCircularQueueEnQueue(&q, 14);
	myCircularQueuePrint(&q);

	myCircularQueueDeQueue(&q);

	myCircularQueuePrint(&q);
	system("pause");
	return 0;
}