您的位置:首页 > 编程语言 > C语言/C++

用C++链式队列解决经典问题:舞伴问题!(带注释)

2010-10-25 16:33 966 查看
舞伴问题描述如下:

就是说有个PARTY舞会需要进行跳舞,当然是男的跟女的搭档了。就是男的一个队列,女的一个队列,然后互相出队列,进行匹配跳舞,如果男的队列跟女的队列人一样多,则输出 匹配完美结束,若最后男的剩下或者女的剩下,此时输出剩下的队列中第一个人的名字,比如I,则输出 I还在干等着呢!大体意思就是这!

代码如下:(还是没有区分.h文件,大家懂的,分不分在这里也没有什么意义可言)

#include<stdio.h>
#include<iostream>
#include<assert.h>
template<class T>
class LinkQueueNode//结点类定义
{
	public:
		T data;
		LinkQueueNode<T>* link;
		LinkQueueNode(T& value):data(value),link(NULL){}
};
template<class T>
class LinkQueue
{
	LinkQueueNode<T>* front;
	LinkQueueNode<T>* back;
public:
	LinkQueue():front(NULL),back(NULL){}
	void EnQueue(T& element);
	T DelQueue();
	T& GetFront();
	void MakeEmpty();
	bool IsEmpty();
};
//实现如下
template<class T>
void LinkQueue<T>::EnQueue(T& value)
{
	LinkQueueNode<T>* add=new LinkQueueNode<T>(value);
	if(back==NULL)//添加第一个结点,让front指向这个结点
	{
		front=back=add;
	}
	else//如果队列中人家已经有结点,则需要改变back指针
	{
		back->link=add;
		back=back->link;
		
	}
}
template<class T>
T LinkQueue<T>::DelQueue()
{
	//首先得判断是否为空队列
	assert(!IsEmpty());
	LinkQueueNode<T>* old=front;
	T data=old->data;//保留原对头数据
	front=front->link;//移动对头指针
	if(back==old)
		back=NULL;
	delete old;
	return data;

}
template<class T>
T& LinkQueue<T>::GetFront()
{
	assert(!IsEmpty());//断言,这东西挺好使滴
	return front->data;
}
template<class T>
void LinkQueue<T>::MakeEmpty()
{
	while(!IsEmpty())
	{
		this->DelQueue();
	}

}
template<class T>
bool LinkQueue<T>::IsEmpty()
{
	return front==NULL;
}
#include<string>
using namespace std;
struct dancer//一会就让队列中存储这种结构体类型
{
	string name;
	char sex;
};
int main()
{
	cout<<"请输入舞伴总数量:"<<endl;
	int num;
	cin>>num;
	LinkQueue<dancer> mdancer;
	LinkQueue<dancer> fdancer;
	for(int i=0;i<num;i++)
	{
		cout<<"请输入舞者性别(f(女) or m(男))及姓名:"<<endl;
		char sex;
		cin>>sex;
		string name;
		cin>>name;
		dancer newdancer;
		newdancer.name=name;
		newdancer.sex=sex;
		if(sex=='f')//female
		{
			fdancer.EnQueue(newdancer);
		}
		if(sex=='m')//male
		{
			mdancer.EnQueue(newdancer);
		}

	}
	while( (!mdancer.IsEmpty()) && (!fdancer.IsEmpty() ) )//男女两个队列都有人
	{
		cout<<mdancer.DelQueue().name<<"/t<---配对--->/t"<<fdancer.DelQueue().name<<endl;
	}
	if(!mdancer.IsEmpty())//剩下的帅锅
	{
		cout<<mdancer.GetFront().name<<"先生还在干等着呢!"<<endl;
	}
	else if(!fdancer.IsEmpty())//都是剩下的霉女
	{
		cout<<fdancer.GetFront().name<<"女士还在干等着呢!"<<endl;
	}
	else
		cout<<"配对完美结束!"<<endl;
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐