循环队列的实现:
1>循环队列的初始化创建
2>循环队列的释放
3>循环队列的打印
4>循环队列的判空
5>循环队列的判满
6>求循环队列当前长度
7>循环队列队尾入队
8>循环队列队首出队
#include<iostream>
#define MAXQUEUE 10
typedef int DataType;
enum Status{OK, ERROR, FAILED};
struct CirQueue
{
DataType* base;
int front;
int real;
};
// 初始化创建循环队列
int InitCirQueue(CirQueue& que)
{
que.base = (DataType*) malloc(MAXQUEUE * sizeof(DataType));
if (NULL == que.base)
{
return FAILED;
}
que.front = que.real = 0;
std::cout << "Init CirQueue succeed ~" << std::endl;
return OK;
}
// 释放循环队列
void DestoryCirQueue(CirQueue& que)
{
if (que.base != NULL)
{
free(que.base);
que.base = NULL;
}
std::cout << "Destory CirQueue succeed ~" << std::endl;
}
// 打印循环队列
void PrintCirQueue(CirQueue& que)
{
std::cout << "CirQueue elems [";
int cur = que.front;
while(cur != que.real)
{
std::cout << " " << que.base[cur];
cur = (cur + 1) % MAXQUEUE;
}
std::cout << " ]" << std::endl;
}
// 循环队列判空
int EmptyCirQueue(CirQueue& que)
{
return que.front == que.real;
}
// 循环队列判满
int FullCirQueue(CirQueue& que)
{
if ((que.real + 1) % MAXQUEUE == que.front)
{
return 1;
}
return 0;
}
// 求循环队列长度
int LengthCirQueue(CirQueue& que)
{
return (que.real - que.front + MAXQUEUE) % MAXQUEUE;
}
// 向循环队列添加元素 队尾入队
int EnCirQueue(CirQueue& que, DataType val)
{
if (FullCirQueue(que))
{
std::cout << "the cirqueue is fulled " << std::endl;
return ERROR;
}
que.base[que.real] = val;
que.real = (que.real + 1) % MAXQUEUE;
return OK;
}
// 从循环队列删除元素 队首出队
int DeCirQueue(CirQueue& que, DataType& val)
{
if (EmptyCirQueue(que))
{
std::cout << "the cirqueue is empty" << std::endl;
return ERROR;
}
val = que.front;
que.front = (que.front + 1) % MAXQUEUE;
return OK;
}
int main()
{
CirQueue que;
if (InitCirQueue(que) != OK)
{
std::cout << "Init and create cirqueue failed" << std::endl;
return 0;
}
PrintCirQueue(que);
if (EmptyCirQueue(que))
{
std::cout << "cirqueue empty" << std::endl;
}
if (FullCirQueue(que))
{
std::cout << "cirqueue full" << std::endl;
}
std::cout << "CirQueue current length = " << LengthCirQueue(que) << std::endl;
for (int i = 1; i <= MAXQUEUE; i++)
{
if (OK != EnCirQueue(que, i))
{
std::cout << "insert elem to cirqueue failed " << std::endl;
break;
}
PrintCirQueue(que);
std::cout << "CirQueue current length = " << LengthCirQueue(que) << std::endl;
}
PrintCirQueue(que);
if (EmptyCirQueue(que))
{
std::cout << "cirqueue empty" << std::endl;
}
if (FullCirQueue(que))
{
std::cout << "cirqueue full" << std::endl;
}
std::cout << "Delete elems" << std::endl;
DataType val;
for (int i = 0; i < MAXQUEUE; i++)
{
if (OK != DeCirQueue(que, val))
{
std::cout << "delete elem from cirqueue failed " << std::endl;
break;
}
PrintCirQueue(que);
std::cout << "CirQueue current length = " << LengthCirQueue(que) << std::endl;
}
DestoryCirQueue(que);
return 0;
}