使用数组实现一个循环队列,实现的方法包括:队列的初始化、元素进队列、元素出队列、队列判空、队列判满、取队头元素、取队尾元素、
遍历队列并对各数据项调用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;
}