首先说明一下,不可以用递归算法,递归算法我已经实现了,我想换其它算法实现。一个类A它有n个子类A1和A2,.......An。
Ai是一般项(这里的一般项不一定是第一级子类),它可能有子类也可能没有子类。(这个我可以判断出来,不用大家担心)举例说明:Ai可以是1级子类A2,也可以是A2的子类Am或者更下面的子类Aj。Ai具有一些属性(每一个子类的属性不完全相同。)我可以遍历所有这些父类和子类的属性集合,也可以判断任意给出一个属性名字时,判断这个属性是否附属于某个名字的类。我可以做一个函数void Fun():把某一层辈份的父类(比如A2)的所有子类(比如叫A11,A12,A13,A14......A1k)遍历.
递归算法是重复调用Fun();现在谁能给我一个方法,不用递归算法,而遍历所有类及其属性。

解决方案 »

  1.   

    递归的过程是借用i stack来完成的,既然楼主递归完成了,那么非递归就借用一个stl queue<> or stack<>来完成了.
      

  2.   


    #include <Zoe1.h>
    #include <Schema.h>
    #include <assert.h>
    #include <Tanker.h>
    #include <Server_resolve.h>
    #include <iostream>using namespace std;
    using namespace Ablaze;
    ObjectDictionary* pDic = new ObjectDictionary();
    char pText[800];
    char pWord[200];
    char Text[160];void TraverseClsTree(FILE *ptxtList,const char *pBaseClassName)
    {
    if (!ptxtList)
    {
    return;
    } int i=0,k,num;
    const char *pCurrentClsName=pBaseClassName;
    const char* record[30];////记录相同辈份兄弟类的元素
    const char* attrName = NULL;
    ClassSchema schema; schema=pDic->GetFirstSubClass(pCurrentClsName);
    if (schema.IsNull())
    {
    return;
    } const char *pClsName=schema.GetClassName();
    if (pClsName==NULL)
    {
    return;
    }
    Text[0]='\0';
    bool flag=false;
    IDataSchema *IdataSchema = NULL; k=pDic->GetSubClassCount(pCurrentClsName,false);////获取子类的个数。 while(i!=k)
    {
    if ( pClsName == NULL ) break;
    memset(pText, 0, 500);
    memset(pWord, 0, 80);
    strcpy(pText,"Create table ");
    strcat(pText,pClsName);//类名写到文本中去
    strcat(pText,"\n ("); IdataSchema=pDic->GetDataSchema(pClsName);
    cout << endl;
    cout << "CLASS: " << pClsName << ", SchemaName: " << IdataSchema->ClassName() << endl;
    cout << "----------------------------------------------" << endl; bool b1=schema.CheckAbstract();
    bool b2=pDic->IsClassDynamic(pClsName);

    //由schema把子类的类名和属性写到指定目录下。
    attrName = pDic->BeginAttributeEnum();
    while ( attrName != NULL ) 
    {
    bool b3=IdataSchema->IsAttrAttached(attrName,true);
    if ( b3 ) {
    cout << IdataSchema->ClassName() << " : " << attrName << endl;
    }
      if (!b1 && !b2 && 
    b3)
    {
    flag=true;
    sprintf(pWord,"\"%s\"",attrName);
    unsigned int AttrID=pDic->GetAttributeID(attrName);
    size_t Capacity=pDic->GetAttributeSize(AttrID);
    num=pDic->GetAttributeType(AttrID);
    switch (num)
    {
    case PARAM_TYPE_INVALID:
    sprintf(Text," Invalid,\n");
    break;
    case PARAM_TYPE_CHAR:
    sprintf(Text," char(%d),\n",Capacity);
    break;
    case PARAM_TYPE_SHORT:
    sprintf(Text," short(%d),\n",Capacity);
    break;
    case PARAM_TYPE_INT:
    sprintf(Text," int(%d),\n",Capacity);
    break;
    case PARAM_TYPE_LONG:
    sprintf(Text," long(%d),\n",Capacity);
    break;
    case PARAM_TYPE_FLOAT:
    sprintf(Text," float(%d),\n",Capacity);
    break;
    case PARAM_TYPE_DOUBLE:
    sprintf(Text," double(%d),\n",Capacity);
    break;
    case PARAM_TYPE_BOOL:
    sprintf(Text," bool(%d),\n",Capacity);
    break;
    case PARAM_TYPE_OBJECT:
    sprintf(Text," object(%d),\n",Capacity);
    break;
    case PARAM_TYPE_STRING:
    sprintf(Text," string(%d),\n",Capacity);
    break;
    case PARAM_TYPE_LIST:
    sprintf(Text," list(%d),\n",Capacity);
    break;
    case PARAM_TYPE_VALUESET:
    sprintf(Text," valueset(%d),\n",Capacity);
    break;
    case PARAM_TYPE_NVSET:
    sprintf(Text," nvset(%d),\n",Capacity);
    break;
    case PARAM_TYPE_FULLTABLE:
    sprintf(Text," fulltable(%d),\n",Capacity);
    break;
    case PARAM_TYPE_OBJECTSET:
    sprintf(Text," objectset(%d),\n",Capacity);
    break;
    case PARAM_TYPE_DESCRIPTOR:
    sprintf(Text," descriptor(%d),\n",Capacity);
    break;
    } if (strcmp(attrName,"UUID")==0)
    {
    strcat(Text,"[not null][primary key],\n");
    }
                                   //把属性类型写到pText里面去
    strcat(pWord,Text);
    strcat(pText,pWord);
      } attrName = pDic->EnumNextAttribute();//遍历属性
    }
    IdataSchema->Release(); if (flag)
    {
    *(pText+strlen(pText)-2)='\0';////去除掉最后一个参数后面多余的comma
    fprintf(ptxtList,"%s\n);\n",pText);
    }
    flag=false;
    pCurrentClsName=pClsName;//将其覆写到pCurrentClsName中
    record[i]=pCurrentClsName;//登记存储当前同等辈份的兄弟类元素
    schema=pDic->GetSiblingClass(pCurrentClsName);////获得当前子类的兄弟类结构体
    if (!schema.IsNull())
    {
    pClsName=schema.GetClassName();
    }
    else pClsName = NULL;
    ++i;
    }
            ////下面递归
    for (num=0;num<k;++num)
    {
    pClsName=record[num];
    TraverseClsTree(ptxtList,pClsName);
    }
    }int main()
    {
    //根据对象字典初始化数据库工具
    char *pDir="F:\\test\\SQL.txt";
    FILE *ptxtList=fopen(pDir,"w");
    const char *pBaseClassName = NULL;
    const char* attrName = NULL;
    // 根据系统缺省配置创建一个对象字典的实例

    assert( pDic != NULL );
    pBaseClassName=pDic->GetRootClass();
    TraverseClsTree(ptxtList,pBaseClassName); //获取对象字典中定义的可实例化的类的个数
    int InstantibleNum=pDic->GetInstantiableClassCount();
    cout<<"可实例化的类的个数是:"<<InstantibleNum<<"\n";
    //获取对象字典中定义的类的个数
    int TotalNum=pDic->GetClassCount();
    cout<<"类的总个数是:"<<TotalNum;
    // 释放内存
    fclose(ptxtList);
    delete pDic;
    return 0;
    }