C++数据结构之链队列的入队出队以及舞会匹配问题

图解参考 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;
 
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值