第一章:C++程序设计

今天终于下定决心将数据结构与算法重新在复习一遍,先是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值