今天终于下定决心将数据结构与算法重新在复习一遍,先是C++的一些比较容易忘记的特性简单的温习一遍:包括递归调用,异常操作,类模板,函数模板等等,这三天写得源码如下:
///
// Book name : C++ structure and algorithm
// FileName : chapter1.cpp
// Version : 1.0
// Author : Yangfei
// Date : 2010-04-02 9:18:38
// Comment : 递归问题:实现N!,斐波那切数列,排列问题,汉诺塔问题,帕斯卡三角形
// 二叉树的先序,中序,后序遍历
///
#include <iostream>
#include <exception>
using namespace std;
int fun(int n)
{
if(n<=1)
return 1;
else
return n*fun(n-1);
}
//递归的斐波那切函数
int fibo(int n)
{
if(n==0)
return 0;
else if(n==1)
return 1;
else
return fibo(n-2)+fibo(n-1);
}
//非递归的斐波那切函数
void nfibo(int n)
{
int f0=0,f1=1;
int f;
for(int i=2;i<=n;i++)
{
f=f0+f1;
f0=f1;
f1=f;
}
cout<<"f["<<n<<"]="<<f<<endl;
}
//汉诺塔问题
void move(char x,int n,char y)
{
cout<<"将圆盘"<<n<<"从柱子"<<x<<"移动到柱子"<<y<<endl;
}
void hanoi(char x,char y,char z,int n)
{
if(n==1)
move(x,1,z);
else
{
hanoi(x,z,y,n-1);
move(x,n,z);
hanoi(y,x,z,n-1);
}
}
//帕斯卡三角形
int pasc(int row,int col)
{
return (col==1||row==col)?1:pasc(row-1,col-1)+pasc(row-1,col);
}
void PrintPasc(int n)
{
int row,col;
for(row=1;row<=n;row++)
{ for(col=1;col<=row;col++)
cout<<pasc(row,col)<<" ";
cout<<endl;
}
}
template <class T>
T Sum(T a[],int n)
{
T tempSum=0;
for(int i=0;i<n;i++)
tempSum+=a[i];
return tempSum;
}
template <class T>
T RSum(T a[],int n)
{
if(n==0)
return 0;
else
return a[n-1]+RSum(a,n-1);
}
//排列问题
template <class T>
void Perm(T list[],int k,int m)
{
int i;
if(k==m)
{
for(i=0;i<m;i++)
cout<<list[i];
cout<<endl;
}
else
for(i=k;i<m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
template <class T>
inline void Swap(T& a,T& b)
{
T temp;
temp=a;a=b;b=temp;
}
//三次,输入非负数
template <class T>
bool Input(T& a)
{
T t;
cout<<"请输入一个数:"<<endl;
for(int i=0;i<3;i++)
{
cin>>t;
if(t>=0)
{
a=t;
return true;
}
else
{
cout<<"输入非法,请重新输入:"<<endl;
}
}
return false;
}
//验证某数组是否按升序排序
template <class T>
bool IsAscSort(T a[],int n)
{
for(int i=0;i<n-1;i++)
{
if(a[i]<=a[i+1])
continue;
else
return false;
}
return true;
}
//递归输出N个元素的子集
//递归确定元素x是否属于数组a
//操作符new,delete,二维数组操作
//二叉树类模板定义
template <class T>
class BiTree
{
friend void visit(BiTree<T> *t);
friend void preOder_recursive(BiTree<T> *t);
friend void InOder_recursive(BiTree<T> *t);
friend void PostOder_recursive(BiTree<T> *t);
friend void CreateBiTree(BiTree<T>* BiTreeNode);
public:
BiTree<T> *lChild;
BiTree<T> *rChild;
T data;
public:
BiTree()
{
lChild=rChild=NULL;
}
//void CreateBiTree(BiTree<T>* BiTreeNode);
};
BiTree<char> *head=NULL;
//访问结点数据函数模板
template <class T>
void visit(BiTree<T> *t)
{
if(t)
{
cout<<t->data<<" ";
}
}
//先序创建一棵二叉树
template <class T>
void CreateBiTree(BiTree<T>* &BiTreeNode)
{
T ch;
cin>>ch;
if(ch=='#')
BiTreeNode=NULL;
else
{
BiTreeNode=new BiTree<T>();
if(head==NULL)
head=BiTreeNode;
BiTreeNode->data=ch;
CreateBiTree<T>(BiTreeNode->lChild);
CreateBiTree<T>(BiTreeNode->rChild);
}
}
//递归方式遍历二叉树:先序,中序,后序
//先序遍历二叉树
template <class T>
void preOder_recursive(BiTree<T> *t)
{
if(t)
{
visit<T>(t);
preOder_recursive<T>(t->lChild);
preOder_recursive<T>(t->rChild);
}
}
//中序遍历二叉树
template <class T>
void InOder_recursive(BiTree<T> *t)
{
if(t)
{
cout<<"(";
InOder_recursive<T>(t->lChild);
visit<T>(t);
InOder_recursive<T>(t->rChild);
cout<<")";
}
}
//后序遍历二叉树
template <class T>
void PostOder_recursive(BiTree<T> *t)
{
if(t)
{
PostOder_recursive<T>(t->lChild);
::PostOder_recursive<T>(t->rChild);
visit<T>(t);
}
}
//非递归方式遍历二叉树:先序,中序,后序
int main()
{
int a=4;
int b[4]={1,2,5,4};
int m,f;
int c;
hanoi('a','b','c',2);
PrintPasc(5);
BiTree<char> *p_Root=NULL;
/*BiTree<int> *lchild=new BiTree<int>();
BiTree<int> *rchild=new BiTree<int>();
p_Root->data=1;
p_Root->lChild=lchild;
p_Root->rChild=rchild;
lchild->data=2;
rchild->data=3;*/
CreateBiTree<char>(p_Root);
//visit<int>(lchild);
preOder_recursive<char>(head);
cout<<endl;
InOder_recursive<char>(head);
cout<<endl;
PostOder_recursive<char>(head);
cout<<endl;
if(Input(c))
cout<<"Input函数返回成功:"<<c<<endl;
else
cout<<"Input函数返回失败"<<endl;
if(IsAscSort(b,4))
cout<<"it is a ascending array!"<<endl;
else
cout<<"it is not a ascending array!"<<endl;
m=fun(a);
f=fibo(a);
cout<<m<<endl;
cout<<f<<endl;
cout<<Sum(b,2)<<endl;
cout<<RSum(b,2)<<endl;
Perm(b,0,4);
//try-throw-catch异常处理
float* x;
try
{
x=new float[10];
}
catch(float* x){
cout<<"Out of Memory."<<endl;
exit(1);
}
nfibo(3);
return 0;
}