图解参考 https://www.jianshu.com/p/9cc7c7a53524
#ifndef LinkQueue_H
#define LinkQueue_H
template<class DataType>
struct Node
{
DataType data;
Node<DataType>*next;
};
template<class DataType>
class LinkQueue
{
public:
LinkQueue();
~LinkQueue();
void EnQueue(DataType x);
DataType DeQueue();
DataType GetQueue();
int Empty();
private:
Node<DataType> *front,*rear;
};
#endif;
LinkQueue.cpp
#include "LinkQueue.h"
template<class DataType>
LinkQueue<DataType>::LinkQueue()
{
Node<DataType> * s=NULL;
s = new Node<DataType>;
s->next = NULL;
front = rear = s;
}
template<class DataType>
LinkQueue<DataType>::~LinkQueue()
{
Node<DataType> * p=NULL;
while(front != NULL)
{
p = front ->next;
delete front;
front = p;
}
}
template<class DataType>
void LinkQueue<DataType>::EnQueue(DataType x)
/*入队操作 从一端进入,对新增节点进行赋值 ,
将新的节点的指针地址赋给原来的尾部指针,
然后将新的节点变为尾部指针 */
{
Node<DataType> *s=NULL;
s = new Node<DataType>;
s->data=x;
s->next = NULL;
rear->next=s;
rear=s;
}
template<class DataType>
DataType LinkQueue<DataType>::DeQueue()
{
Node<DataType> * p=NULL;//定义一个节点 Node类型的指针
int x;
if(rear == front) throw"下溢";//判断是否有元素可删除
p = front->next;//p指向第一个元素
x = p->data;//为后面返回的值做准备
front->next = p->next;//将第一个指针的指针域给头指针的指针域,跳过p指向的结点
if(p->next ==NULL) rear = front;//如果删除的结点是最后一个结点则头指针与尾指针指向同一个结点
delete p;//删除跳过的P结点
return x;//返回删除结点的元素
}
template<class DataType>
DataType LinkQueue<DataType>::GetQueue()
{
if(front != rear)
return front->next->data;//获取结点第一个值
}
template<class DataType>
int LinkQueue<DataType>::Empty()
{
if(front== rear)
return 1;
else
return 0;
}
#include <iostream>
using namespace std;
#include "LinkQueue.cpp"
int main()
{
LinkQueue<int> Q;
if(Q.Empty())
cout<<"队列为空"<<endl;
else
cout<<"队列非空"<<endl;
cout<<"元素10和15执行入队操作:"<<endl;
try
{
Q.EnQueue(10);
Q.EnQueue(15);
}
catch (char *wrong)
{
cout<<wrong<<endl;;
}
cout<<"查看队头元素:"<<endl;
cout<<Q.GetQueue()<<endl;
cout<<"执行出队操作:"<<endl;
try{
Q.DeQueue();
}
catch(char *wrong)
{
cout<<wrong<<endl;
}
cout<<"查看队头元素"<<endl;
cout<<Q.GetQueue()<<endl;
char M[5]={'a','b','c','d','e'};
char W[2]={'f','g'};
LinkQueue<char> Man;
LinkQueue<char> Woman;
char m,w;
int n;
for(int i=0;i<5;i++){
Man.EnQueue(M[i]); //男生成员入队
}
for(int i=0;i<2;i++){
Woman.EnQueue(W[i]);//女生成员入队
}
cout<<"请输入第几首歌曲"<<endl;
cin>>n;
for(int k=0;k<n;k++){
while(!Man.Empty()&&!Woman.Empty()){ //当男女队列不为空的时候进行出队
m=Man.DeQueue();//男生出队 先进先出的原则。
w=Woman.DeQueue();//女生出队
cout<<"男生"<<m<<"与女生"<<w<<"匹配"<<endl;
}
if(!Man.Empty()&&Woman.Empty()){//依次出队之后还剩下的队列
//对队列空的队列添加成员,等待下一首歌的出队
for(int i=0;i<2;i++){
Woman.EnQueue(W[i]);
}
}
else if(!Woman.Empty()&&Man.Empty()){//依次出队之后还剩下的队列
//同上
for(int i=0;i<5;i++){
Man.EnQueue(M[i]);
}
}
else{
//如果人数正好全部匹配成功,全部队空,那就一次全部入队,等待下一首歌曲的出队
for(int i=0;i<5;i++){
Man.EnQueue(M[i]);
}
for(int i=0;i<2;i++){
Woman.EnQueue(W[i]);
}
}
}
system("pause");
return 0;
}