//借鉴《实用数据结构》一书
#include <iostream>
using namespace std;
void Menu();//定义菜单选项框
//定义循环队列类
template <class T> //模板声明,数据元素虚拟类型为T
class sq_Queue
{ private: //数据成员
int mm; //存储空间容量
int front; //排头指针
int rear; //队尾指针
int s; //标志
T *q; //循环队列存储空间首地址
public: //成员函数
sq_Queue(int); //构造函数,建立空循环队列
void prt_sq_Queue(); //输出排头与队尾指针以及队中元素
int flag_sq_Queue(); //检测循环队列的状态
void ins_sq_Queue(T); //入队
T del_sq_Queue(); //退队
};
//建立容量为mm的空循环队列
template <class T>
sq_Queue<T>::sq_Queue(int m)
{ mm=m; //存储空间容量
q=new T[mm]; //动态申请存储空间
front=mm; rear=mm; s=0;
return;
}
//输出排头与队尾指针以及队中元素
template <class T>
void sq_Queue<T>::prt_sq_Queue()
{ int i;
cout <<"front=" <<front <<endl;
cout <<"rear=" <<rear <<endl;
if (s==0) { cout <<"队列空!" <<endl; return; }
i=front;
do { i=i+1;
if (i==mm+1) i=1;
cout <<q[i-1] <<endl;
} while (i!=rear);
return;
}
//检测循环队列的状态
template <class T>
int sq_Queue<T>::flag_sq_Queue()
{ if ((s==1)&&(rear==front)) return(-1); //存储空间已满,返回-1
if (s==0) return(0); //循环队列为空,返回0
return(1); //正常返回1
}
//入队
template <class T>
void sq_Queue<T>::ins_sq_Queue(T x)
{ if ((s==1)&&(rear==front)) //存储空间已满,上溢错误
{ cout <<"Queue_overflow!" <<endl; return; }
rear=rear+1; //队尾指针进一
if (rear==mm+1) rear=1;
q[rear-1]=x; //新元素入队
s=1; //入队后队列非空
return;
}
//退队
template <class T>
T sq_Queue<T>::del_sq_Queue()
{ T y;
if (s==0) //队列为空,下溢错误
{ cout <<"Queue_underflow!" <<endl; return(0); }
front=front+1; //排头指针进一
if (front==mm+1) front=1;
y=q[front-1]; //将退队元素赋给变量
if (front==rear) s=0;
return(y); //返回退队的元素
}
void Menu()
{
cout<<"**********************Menu****************************"<<endl;
cout<<" ----------1. 输出队 ------------------"<<endl;
cout<<" ----------2. 入队 ------------------"<<endl;
cout<<" ----------3. 退队 ------------------"<<endl;
cout<<"******************************************************"<<endl;
}
int main()//main函数
{
cout<<"请输入您要建立的队列容量(元素为整形)"<<endl;
int len;
cin>>len;
sq_Queue<int> q(len);
Menu();
int chs;
cout<<"请输入你的选择"<<endl;
cin>>chs;
if(chs<1||chs>3)
{cout<<"Out of Bounds"<<endl;return 0;}
while(chs!=0)
{
switch(chs)
{
case 1:
cout <<"输出排头与队尾指针以及队中元素:" <<endl;
q.prt_sq_Queue(); //输出排头与队尾指针以及队中元素
break;
case 2:
int inp;
cout<<"请输入要入队的元素(整形)"<<endl;
cin>>inp;
q.ins_sq_Queue(inp);
break;
case 3:
cout <<"输出退队元素:" <<endl;
cout<<"请输入要退队的元素个数"<<endl;
int num;
cin>>num;
for(int i=0;i<num;i++)
cout <<q.del_sq_Queue() <<endl;
break;
}
Menu();
cin>>chs;
}
}
VC6.0运行结果如下:
队列的简单操作
最新推荐文章于 2022-07-08 21:52:40 发布