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

Posted 春风又一季

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
 
 

以上是关于C++数据结构之链队列的入队出队以及舞会匹配问题的主要内容,如果未能解决你的问题,请参考以下文章

[数据结构]——队列的实现(初始化销毁入队出队获取队头队尾数据获取队列数据总数判断队列是否为空)

[数据结构]——队列的实现(初始化销毁入队出队获取队头队尾数据获取队列数据总数判断队列是否为空)

[数据结构]——队列的实现(初始化销毁入队出队获取队头队尾数据获取队列数据总数判断队列是否为空)

[数据结构]——队列的实现(初始化销毁入队出队获取队头队尾数据获取队列数据总数判断队列是否为空)

[数据结构] 队列 (C语言)

队列队列的分类和实现