#include <iostream>
using namespace std;
template <class T>
struct LinkNode
{
T data;
LinkNode<T>* link;
LinkNode(T x,LinkNode<T>*p=NULL)
{
data=x;
link=p;
}
};
template <class T>
class LinkedQueue
{
public:
LinkedQueue();//构造函数初始化
~LinkedQueue();//析构函数置空
bool EnQueue(const T&x);
//插入函数
bool DeQueue(T&x);//从队头出
bool getFront(T&x)const;//得到队头元素
void makeEmpty();//置空函数
bool IsEmpty()const{
return (front==NULL)?true:false;}//判断是否为空
int getSize()const;//得到队列长度
void output(ostream&out);//输出队列元素
private:
LinkNode<T>*front,*rear;//尾指针和头指针
};
template<class T>
LinkedQueue<T>::LinkedQueue() {
//构造函数,初始化队头和队尾指针
front = rear = NULL;
}
template<class T>
void LinkedQueue<T>::makeEmpty() //置空函数
{
LinkNode<T>*p;//工作指针
while(front!=NULL)//从队头删元素,首先要判断前提条件
{
p=front;//保存
front=front->link;//移动
delete p;//删除
}
}
template <class T>
bool LinkedQueue<T>::EnQueue(const T&x)//队尾插入元素
{
if(NULL==front){//前提条件判断,观察是否有空间
front=rear=new LinkNode<T>(x);//开辟空间
if(NULL==front) //双重保障,判断是否成功开辟空间
{
return false;}}
else{
rear->link=new LinkNode<T>(x);//从队尾插入
if(NULL==rear->link)
return false;//再次判断是否成功开辟空间给x
rear=rear->link; }//更新尾指针
return true;
}
template <class T>
bool LinkedQueue<T>::DeQueue(T&x) //从队头删元素
{
if(IsEmpty())//前提条件判断,是否有元素
return false;
LinkNode<T>*p=front;//保存
x=front->data;
front=front->link;//移动
delete p;//删除
return true;
}
template <class T>
bool LinkedQueue<T>::getFront(T&x)const{//返回队头元素
if(IsEmpty())//前提条件判断
{
cout<<"无法输出队头元素,队列为空!"<<endl;
return false;
}
else
x=front->data;//获取队头元素值
cout<<"队头元素为"<<x<<endl;
return true;
}
template <class T>
int LinkedQueue<T>::getSize()const//获取元素个数
{
LinkNode<T>*p=front;//建立工作指针
int k=0;//计数变量
while(p!=NULL)//判断条件
{
k++;//计数
p=p->link;//移动
}
cout<<"当前队列的长度为"<<k<<endl;
return k;
}
template<class T>
LinkedQueue<T>::~LinkedQueue() {
//析构函数,释放程序中的资源
makeEmpty();
}
template <class T>
void LinkedQueue<T>::output(ostream&out)
{
LinkNode<T> *current=front;
while(current!=NULL)
{
out<<current->data<<" ";
current=current->link;//移动
}
cout<<endl;
}
template <class T>
ostream&operator<<(ostream&out,LinkedQueue<T>&Q)
{
Q.output(out);
return out;
}
int main()
{
cout<<"------------------链式队列--------------------"<<endl;
LinkedQueue<int> link_Q;
bool end=false;
int choice;
while(!end)
{
cout<<"1:建立链式队列"<<endl;
cout<<"2:获取队列长度"<<endl;
cout<<"3:判断队列是否为空" <<endl;
cout<<"4:将队列置空"<<endl;
cout<<"5:在队尾插入元素"<<endl;
cout<<"6:获取队头元素"<<endl;
cout<<"7:删除队头元素"<<endl;
cout<<"8:输出队列元素"<<endl;
cout<<"9:退出" <<endl;
cout<<"请输入要进行的操作1~9";
cin>>choice;
switch(choice)
{
case 1:
cout<<"请输入链式队列的元素个数";
int n;
cin>>n;
cout<<"请依次输入元素值"<<endl;
int a[1000];//可修改
for(int i=0;i<n;i++)
{
cin>>a[i];
link_Q.EnQueue(a[i]);
}
cout<<"当前队列元素为" <<endl;
cout<<link_Q;
break;
case 2:
link_Q.getSize();
break;
case 3:
if(link_Q.IsEmpty())
cout<<"链式队列为空!"<<endl;
else
cout<<"链是队列不为空!" <<endl;
break;
case 4:
link_Q.makeEmpty();
cout<<"已置空!"<<endl;
break;
case 5:
cout<<"请输入插入的元素"<<endl;
int val;
cin>>val;
link_Q.EnQueue(val);
break;
case 6:
link_Q.getFront(n);
break;
case 7:
link_Q.DeQueue(n);
cout<<"删除的队头元素为"<<n<<endl;
break;
case 8 :
cout<<"当前队列元素为"<<endl;
cout<<link_Q;
break;
case 9:
end=true;
break;
default:
cout<<"输入错误! 请重新输入!!!"<<endl;
}
cout<<endl;
}
return 0;
}