您的位置:首页 > 理论基础 > 数据结构算法

用队列解决数据结构经典问题:杨辉三角形问题。

2010-10-26 11:22 309 查看
1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

就是下面的元素是这个元素“肩膀上”的两个元素之和。

思路:首先初始化一个队列,元素为1,然后根据这个队列迭代生成任意行的二项式系数。

判断用户输入的行数,然后决定循环次数。这些循环中,程序根据杨辉三角的实际构造函数模拟构造过程。每次形成一个新的二项式系数序列,并将这个序列 保持在一个新的队列中。本次循环结束后,这个心构造的序列将作为下次循环来构造另一个二项式序列的参照序列。



代码如下:

#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;

//template<class T>//这里用这个模板编译出错,调试的时候就果断放弃他了
void evaluate(LinkQueue<int>&  ori,LinkQueue<int>& target)
{//这个函数的作用就是这次生成的新的序列作为下次的开始序列
	ori.MakeEmpty();
	while(!target.IsEmpty())
	{
		int temp=target.DelQueue();//不用这个临时变量来存放出队的结果,编译器不给通过,编译器这里把target.DelQueue()看做一个const类型,所以会提示类型转换错误
		ori.EnQueue(temp);
	}
}
int a=1;
int main()
{
	cout<<"请输入杨辉三角形阶数i(i>2):";
	int num;
	cin>>num;
	LinkQueue<int> ori;
	ori.EnQueue(a);
	ori.EnQueue(a);
	LinkQueue<int> next;
	for(int i=0;i<num-2;i++)
	{
		next.EnQueue(a);
		while(!ori.IsEmpty())
		{
			int j=ori.DelQueue();
			if(!ori.IsEmpty())
			{
				int temp=j+ori.GetFront();//这里原来跟上述类似
				next.EnQueue(temp);
			}
			else
				next.EnQueue(a);

		}
		evaluate(ori,next);
	}
	cout<<"杨辉三角形第"<<num<<"行内容如下:"<<endl;
	while(!ori.IsEmpty())
	{
		cout<<ori.DelQueue()<<" ";
	}
	cout<<"结束!"<<endl;
	return EXIT_SUCCESS;
}


乱七八槽的,代码呢没做什么整理,添加了一些注释。

重新修改了一下代码,使得更加通用,更加容易理解。代码如下:

#include<stdio.h>
#include<iostream>
#include<assert.h>
template<class T>
class LinkQueueNode//结点类定义
{
	public:
		T data;
		LinkQueueNode<T>* link;
		LinkQueueNode(const T& value):data(value),link(NULL){}//这里传递类型const
};
template<class T>
class LinkQueue
{
	LinkQueueNode<T>* front;
	LinkQueueNode<T>* back;
public:
	LinkQueue():front(NULL),back(NULL){}
	void EnQueue(const T& element);//这里也传递const,当然也可以不修改这里,自己再去重载一个参数为const类型的入队函数跟构造函数,道理一样
	T DelQueue();
	T& GetFront();
	void MakeEmpty();
	bool IsEmpty();
};
//实现如下
template<class T>
void LinkQueue<T>::EnQueue(const 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;

template<class T>//用模板实现方式
void evaluate(LinkQueue<T>&  ori,LinkQueue<T>& target)
{
	ori.MakeEmpty();
	while(!target.IsEmpty())
	{
		ori.EnQueue(target.DelQueue());
	}
}
int main()
{
	cout<<"请输入杨辉三角形阶数i(i>2):";
	int num;
	cin>>num;
	LinkQueue<int> ori;
	ori.EnQueue(1);
	ori.EnQueue(1);
	LinkQueue<int> next;
	for(int i=0;i<num-2;i++)
	{
		next.EnQueue(1);
		while(!ori.IsEmpty())
		{
			int j=ori.DelQueue();
			if(!ori.IsEmpty())
			{
				next.EnQueue(j+ori.GetFront());
			}
			else
				next.EnQueue(1);

		}
		evaluate(ori,next);
	}
	cout<<"杨辉三角形第"<<num<<"行内容如下:"<<endl;
	while(!ori.IsEmpty())
	{
		cout<<ori.DelQueue()<<" ";
	}
	cout<<"结束!"<<endl;
	return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: