#include #include typedef struct _FRAME{ int child; int brother; char* Name; _FRAME() { child = -1; brother = -1; Name = 0; } }FRAME; class Hierarchy{ public: Hierarchy(); ~Hierarchy(); void AddFrame(char* Name); //Frame追加 void AddBracket(void); //閉じカッコ追加 void DispHierarchy(void); //階層を表示(真の表示関数Dispを隠蔽している) private: std::vector FrameVec; //Frameのvector配列 std::vector iVec; //階層ごとの、直前のFrameの添え字 int NowLevel; //現在の階層 int BracketNum; //閉じカッコの数 int FrameNum; //Frameの数 void Disp(int Level, int Num); //再帰で階層を表示 void Brank(int Level); //階層を表現する為の、空白を挿入 }; Hierarchy::Hierarchy():NowLevel(0), BracketNum(0), FrameNum(0) { } Hierarchy::~Hierarchy() { } void Hierarchy::AddFrame(char* Name) { FRAME f; f.Name = Name; FrameVec.push_back(f); ++FrameNum; int DifNum = FrameNum - BracketNum; //Frameと閉じカッコの差。階層の判別に使用。 int VecNumber = FrameNum - 1; //FrameVecの添え字 if(DifNum > NowLevel){ ++NowLevel; iVec.push_back(VecNumber); if(NowLevel > 1) FrameVec[iVec[NowLevel - 2]].child = VecNumber; }else if(DifNum == NowLevel){ FrameVec[iVec[NowLevel - 1]].brother = VecNumber; iVec[NowLevel - 1] = VecNumber; }else if(DifNum < NowLevel){ int LevelDownNum = NowLevel - DifNum; //階層が何段下がったか?の変数 NowLevel -= LevelDownNum; FrameVec[iVec[NowLevel - 1]].brother = VecNumber; iVec[NowLevel - 1] = VecNumber; for(size_t i = 0, count = LevelDownNum; i < count; i++) iVec.pop_back(); } } void Hierarchy::AddBracket(void) { ++BracketNum; } void Hierarchy::DispHierarchy(void) { if(FrameNum > 0) Disp(1, 0); } void Hierarchy::Disp(int Level, int Num){ int flag = 0; Brank(Level); std::cout << FrameVec[Num].Name << " {" << std::endl; if(FrameVec[Num].child != -1){ Disp(Level + 1, FrameVec[Num].child); } if(FrameVec[Num].brother != -1){ flag = 1; Brank(Level); std::cout << "}" << std::endl; Disp(Level, FrameVec[Num].brother); } if(flag != 1){ Brank(Level); std::cout << "}" << std::endl; } } void Hierarchy::Brank(int Level) { for(int i = 0, count = Level - 1; i < count; i++) std::cout << " "; } /*↓この階層構造を生成しています。 FrameA { FrameB { FrameC { } FrameD { } } FrameE{ } } */ int main(void) { Hierarchy h; h.AddFrame("FrameA"); h.AddFrame("FrameB"); h.AddFrame("FrameC"); h.AddBracket(); h.AddFrame("FrameD"); h.AddBracket(); h.AddBracket(); h.AddFrame("FrameE"); h.AddBracket(); h.AddBracket(); h.DispHierarchy(); return 0; }