循环队列的实现


使用数组实现一个循环队列,实现的方法包括:队列的初始化、元素进队列、元素出队列、队列判空、队列判满、取队头元素、取队尾元素、


遍历队列并对各数据项调用visit函数、队列置空

代码如下(C实现):

头文件CircQueue.h(队列数据结构和方法声明):

#define  MAXSIZE 20
typedef int ElemType;
typedef struct
{
	ElemType data[MAXSIZE];
	int front;
	int rear;
}CirQueue;

//顺序循环队列的初始化
void QueueInitial(CirQueue *pQ);

//顺序循环队列判空
int IsEmpty(CirQueue *pQ);

//顺序循环队列判满
int IsFull(CirQueue *pQ);

//元素进队列
void EnQueue(CirQueue *pQ,ElemType e);

//元素出队列
ElemType DeQueue(CirQueue *pQ);

//取队头元素
ElemType GetFront(CirQueue *pQ);

//取队尾元素
ElemType GetRear(CirQueue *pQ);

//遍历队列并对各数据项调用visit函数
void QueueTraverse(CirQueue *pQ,void (*visit)(ElemType &));
 
//循环队列置空
void SetEmpty(CirQueue *pQ);

源文件CircQueue.cpp实现

#include"CircQueue.h"
#include <stdio.h>
#include <stdlib.h>
//循环队列结构和方法的声明
//顺序循环队列的初始化
void QueueInitial(CirQueue *pQ)
{
	pQ->front=pQ->rear=0;
}
//顺序循环队列判空
int IsEmpty(CirQueue *pQ)
{
	return pQ->front==pQ->rear;
}
//顺序循环队列判满
int IsFull(CirQueue *pQ)
{
	return (pQ->rear+1)%MAXSIZE==pQ->front;
}
//元素进队列
void EnQueue(CirQueue *pQ,ElemType e)
{
	if (IsFull(pQ))
	{
		printf("队列溢出!\n");
		exit(1);
	}
	pQ->data[pQ->rear]=e;
	pQ->rear=(pQ->rear+1)%MAXSIZE;
}
//元素出队列
ElemType DeQueue(CirQueue *pQ)
{
	if (IsEmpty(pQ))
	{
		printf("空队列!\n");
		exit(1);
	}
	int tmp=pQ->front;
	pQ->front=(pQ->front+1)%MAXSIZE;
	return pQ->data[tmp];
}
//取队头元素
ElemType GetFront(CirQueue *pQ)
{
	if(IsEmpty(pQ))
	{
		printf("队列为空!\n");
		exit(1);
	}
	return pQ->data[(pQ->front)%MAXSIZE];
}

//取队尾元素
ElemType GetRear(CirQueue *pQ)
{
    if (IsEmpty(pQ))
    {
		printf("队列为空!\n");
		exit(1);
    }
	return pQ->data[(pQ->rear-1)%MAXSIZE];
}

//遍历队列元素,进行visit操作
void QueueTraverse(CirQueue *pQ,void (*visit)(ElemType &))
{
	if (IsEmpty(pQ))
	{
		printf("队列为空!\n");
		exit(1);
	}
	int temp=pQ->front;
	while(temp!=pQ->rear)
	{
		visit(pQ->data[temp]);
		temp++;
	}
}
//循环队列置空
void SetEmpty(CirQueue *pQ)
{
	pQ->front=pQ->rear=0;
}

简单测试程序如下:

#include"CircQueue.h"
#include<stdio.h>
#include<stdlib.h>

void ElemAdd(ElemType &ele)
{
	printf("%d ",++ele);
}

int main()
{
	CirQueue *Cirque=(CirQueue *)malloc(sizeof(CirQueue));
	QueueInitial(Cirque);
	for (int i=0;i<10;i++)
	{
		EnQueue(Cirque,i);
		printf("%d ",i);
	}
	printf("\n");
	printf("队头元素为: ");
	printf("%d\n",GetFront(Cirque));
	printf("队尾元素为: ");
	printf("%d\n",GetRear(Cirque));
	QueueTraverse(Cirque,ElemAdd);
	printf("\n");
	while(!IsEmpty(Cirque))
	{
		printf("%d ",GetFront(Cirque));
		DeQueue(Cirque);
	}
	printf("\n");
	SetEmpty(Cirque);
	if (IsEmpty(Cirque))
	{
		printf("队列已置空!\n");
	}
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值