循环队列的基本操作(C语言)

大致思路:循环队列在创建时就要规定有多少块连续的存储单元。在队尾添加元素,在队头删除元素。以front和rear标志队头队尾,初始时front和rear都为0,入队rear加一出队front加一。且rear的位置指向队尾元素的下一个单元
循环队列的基本操作(C语言)_第1张图片
如果向队列添加元素时队列已满,那么就将队首元素出队,新元素添加到原来队末元素所在位置。当rear已经到达队列末尾时应该让rear回到0。

if (rear + 1 >= MAXQSIZE)//在入队列前进行测试,查看rear+1会不会溢出
{
	 rear = 0;
}
else
{
	 rear ++; 
}        

利用模运算可以将代码简化为:

rear = (rear + 1) % MAXSIZE;

在循环队列里的front、rear的移动都要靠(front/rear+1)%MAXSIZE,而不能简单的加减,原因是数组有界,下标不会自动循环。

下面是代码块:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

typedef int elemtype;

typedef struct circlequeue
{
	elemtype queue[MAXSIZE];//也可以定义指针用malloc动态分配内存
	elemtype front;
	elemtype rear;
}cq;

void init_circlequeue(cq * q)
{
	q = (cq*)malloc(sizeof(cq));
	if (!q)
	{
		exit(0);
	}
	q->front = q->rear = 0;
}

void insert_circlequeue(cq*q, elemtype x)
{
	if ((q->rear + 1) % MAXSIZE == q->front)//判断队列是否已满
	{
		exit(0);
	}
	q->queue[q->rear] = x;
	q->rear = (q->rear + 1) % MAXSIZE;//rear加一
}

void delete_circlequeue(cq*q, elemtype*x)
{
	if (q->front == q->rear)//判断队列是否为空
	{
		exit(0);
	}
	*x = q->queue[q->front];
	q->front = (q->front + 1) % MAXSIZE;
}

void len_circlequeue(cq*q)
{
	return (q->rear - q->front + MAXSIZE) % MAXSIZE;
}

int main()
{
	cq*q;
	init_circlequeue(q);
	//算法部分
	//...
	return 0;
}

你可能感兴趣的:(数据结构)