当前位置:网站首页>Circular queue (C language)

Circular queue (C language)

2022-07-06 14:16:00 An Ruoxi~

What we need to pay attention to in the loop queue is the position of each head pointer and tail pointer , Because it's a circular queue , So every time you join the team , Both the head pointer and the tail pointer will +1, But every time I leave the team , Only the tail pointer -1, When the head pointer meets the tail pointer , Indicates that the queue is empty , We can use this to judge the space .

Header file function declaration

#define MAX_SIZE 100
typedef int ELEM_TYPE;
typedef struct Queue {
	ELEM_TYPE* base;// Accept malloc  Space to apply 
	int front;// The head pointer 
	int rear;// Tail pointer 
	//int count;
}Queue,*PQueue;
void Init(PQueue pq);
bool Push(PQueue pq,ELEM_TYPE val);
bool Pop(PQueue pq);
bool Top(PQueue pq,ELEM_TYPE* rtval);
bool IsEmpty(PQueue pq);
bool IsFull(PQueue pq);
int Get_length(PQueue pq);
void Clear(PQueue pq);
void Destory(PQueue pq);
void show(PQueue pq);

Implementation of header file function declaration  

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"cqueue.h"
void Init(PQueue pq) {
	assert(pq!=NULL);
	pq->base = (ELEM_TYPE*)malloc(MAX_SIZE * sizeof(ELEM_TYPE));
	assert(pq->base != NULL);
	pq->front = 0;
	pq->rear = 0;
}
bool Push(PQueue pq, ELEM_TYPE val) {
	assert(pq != NULL);
	if (IsFull(pq)) {
		return false;
	}
	pq->base[pq->rear] = val;
	pq->rear = (pq->rear + 1) % MAX_SIZE;
	return true;
}
bool Pop(PQueue pq) {
	assert(pq != NULL);
	if (IsEmpty(pq)) {
		return false;
	}
	pq->front=(pq->front+1)%MAX_SIZE;
	return true;
}
bool Top(PQueue pq, ELEM_TYPE* rtval) {
	assert(pq != NULL);
	if (IsEmpty(pq)) {
		return false;
	}
	*rtval = pq->base[pq->front];
	return true;
}
bool IsEmpty(PQueue pq) {
	assert(pq != NULL);
	return pq->front == pq->rear;
}
bool IsFull(PQueue pq) {
	assert(pq != NULL);
	return (pq->rear + 1) % MAX_SIZE == pq->front;
}
int Get_length(PQueue pq) {
	assert(pq != NULL);
	int count= (pq->rear - pq->front + MAX_SIZE) % MAX_SIZE;// The first is to prevent negative numbers , The latter is to prevent positive numbers from increasing 
	return count;
}
void Clear(PQueue pq) {
	assert(pq != NULL);
	pq->front = pq->rear = 0;
}
void Destory(PQueue pq) {
	assert(pq != NULL);
	free(pq->base);
	pq->front = pq->rear = 0;
}
void show(PQueue pq) {
	assert(pq != NULL);
	for (int i = pq->front;i!= pq->rear;i=(i+1)%MAX_SIZE) {
		printf("%5d",pq->base[i]);
	}
	printf("\n");
}

Here we should pay attention to , Per head pointer , Tail pointer +1 In order to prevent cross-border , We balance the capacity between it and the circular queue , To prevent cross-border .

Test functions

#include<stdio.h>
#include"cqueue.h"
int main() {
	struct Queue head;
	Init(&head);
	for (int i = 0; i < 20;i++) {
		Push(&head,i+1);
	}
	show(&head);
	printf("front   %d\n",head.front);
	printf("rear   %d\n", head.rear);
	Pop(&head);
	Pop(&head);
	Pop(&head);
	show(&head);
	printf("front   %d\n", head.front);
	printf("rear   %d\n", head.rear);
	ELEM_TYPE temp;
	bool tag=Top(&head,&temp);
	if (tag) {
		printf("temp=   %d\n",temp);
	}
	printf("length=   %d\n", Get_length(&head));
	for (int i = 0; i < 81; i++) {
		Push(&head, i + 1);
	}
	show(&head);
	printf("front   %d\n", head.front);
	printf("rear   %d\n", head.rear);
	printf("length=   %d\n",Get_length(&head));
	Clear(&head);
	Destory(&head);
	show(&head);
	return 0;
}

The test case

原网站

版权声明
本文为[An Ruoxi~]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060918108782.html