#include //c 输入和输出等 如cout
#include //c输入和输出等 如getch
#include //窗口类操作,系统调用如清屏等
#include //控制数据输出格式
#include
#define Maxsize 10 //设置环队的最大空间
enum returninfo{success,fail,overflow,underflow,range_error};//定义返回信息清单
class loopqueue
{
private:
int data[Maxsize]; //数据存储区域
int front,rear; //对头、队尾指针
protected:
int count; //计数器 统计结点个数即线性队列的长度
public:
loopqueue(); //构造函数
~loopqueue(); //析构函数
void clearqueue(void); //清空环队
bool empty(void) const; //判断是否空队
int size(void) const; //求环队的长度
returninfo traverse(void); //遍历环队所有元素
returninfo getfront(int &item) const; //读取队头
returninfo insert(const int &item); //数据入队
returninfo remove(int &item); //数据出队
};
loopqueue::loopqueue() //构造函数
{
front=0; //头指针和尾指针的关系
rear=0;
count=0; //计数器清零,队列没开始时没有实际数据
}
loopqueue::~loopqueue() //析构函数
{
clearqueue();
}
void loopqueue::clearqueue(void) //清空环队
{
front=rear=0; //头指针和尾指针的关系
count=0; //计数器也清零
}
bool loopqueue::empty(void)const //是否空队
{
if(count==0)
return true;
else
return false;
}
int loopqueue::size(void)const //求环队的长度
{
return count;
}
returninfo loopqueue::traverse(void) //遍历环队中的所有元素
{
if(empty())
return underflow; //空队列的处理
cout<<"环队中的全部数据为: Front━>("; //提示显示数据开始
for(int i=front;i //循环显示所有数据
{
cout<<" "<<setw(2)<<data[i%Maxsize];
if (i==count front-1)
cout<<" )<</font>━";
else
cout<<" ,";
}
cout<<" Rear"<<endl; //最后有一个回车的控制
return success; //本次操作成功
}
returninfo loopqueue::getfront(int &item) const //读取一个结点
{
if(empty()) //处理意外
return underflow;
item=data[front]; //返回读取的数据
return success; //本次操作成功
}
returninfo loopqueue::insert(const int &item) //进队
{
if(count>=Maxsize)
return overflow; //满队处理
data[rear]=item; //给数据赋值
rear=(rear 1)%Maxsize;
count ; //计数器加一
return success;
}
returninfo loopqueue::remove(int &item) //出队
{
if(empty())
return underflow;
item=data[front];
front=(front 1)%Maxsize;
count--; //计数器减一
return success;
}
class interfacebase
{
private:
loopqueue queueonface;
public:
void clearscreen(void);
void showmenu(void);
int userchoice(void);
returninfo processmenu(int menuchoice);
};
void interfacebase::clearscreen(void)
{
system("cls");
}
void interfacebase::showmenu(void)
{
cout<<"环队基本功能菜单"<<endl;
cout<<"=========="<<endl;
cout<<"1.数据进队"<<endl;
cout<<"2.数据出队"<<endl;
cout<<"3.显示数据(遍历全部数据)"<<endl;
cout<<"4.判断队空"<<endl;
cout<<"5.读取队头"<<endl;
cout<<"6.求链队长度"<<endl;
cout<<"7.结束程序"<<endl;
cout<<"=========="<<endl;
}
int interfacebase::userchoice(void)
{ int menuchoice;
cout<<"请输入您的选择:";
cin>>menuchoice;
return menuchoice;
}
returninfo interfacebase::processmenu(int menuchoice)
{
int item,returnvalue;
switch(menuchoice) //根据用户的选择进行相应的操作
{
case 1:
cout<<"请输入要进队的新数据:";
cin>>item;
returnvalue=queueonface.insert(item);
if(returnvalue==overflow)
cout<<"对不起,环队已满,进队失败!请按任意键继续..."<<endl;
else
cout<<"进队操作成功!请按任意键继续..."<<endl;
break;
case 2:
returnvalue=queueonface.remove(item);
if(returnvalue==underflow)
cout<<"对不起,环队已空!请按任意键继续..."<<endl;
else
{
cout<<"出队数据为:"<<item<<endl;
cout<<"出队操作成功!请按任意键继续..."<<endl;
}
break;
case 3:
returnvalue=queueonface.traverse();
if(returnvalue==underflow)
cout<<"环队目前为空,没有数据可以显示!请按任意键继续..."<<endl;
else
cout<<"环队遍历操作成功!请按任意键继续..."<<endl;
break;
case 4:
if(queueonface.empty())
cout<<"此时队列为空!请按任意键继续..."<<endl;
else
cout<<"此时队列不为空!请按任意键继续..."<<endl;
break;
case 5:
returnvalue=queueonface.getfront(item);
if(returnvalue==underflow)
cout<<"对不起,环队已空!请按任意键继续..."<<endl;
else
cout<<"队头数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl;
break;
case 6:
cout<<"环队目前的长度为: "<<queueonface.size()<<endl;
cout<<"求环队长度操作成功!请按任意键继续..."<<endl;
break;
case 7:
exit(0);
default:
cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
break;
}
return success;
}
void main(void) //程序主入口
{
int menuchoice; //下面要用到
interfacebase interfacenow;
loopqueue loopqueuenow;
interfacenow.clearscreen();
while (1)
{
interfacenow.showmenu();
menuchoice=interfacenow.userchoice();
interfacenow.processmenu(menuchoice);
getch();
Sleep(200); //延迟了一会
interfacenow.clearscreen();
}
}//主函数结束