?? fifo.h
字號(hào):
}
Tx GetValX()
{
return CFifoX<Tx>::GetValX();
}
void SetValY(Ty Y)
{
if(!this) { return;}
m_Y = Y;
}
Ty GetValY()
{
return m_Y;
}
Tx* GetpValX()
{
if(!this) { return 0;}
return &m_X;
}
Ty* GetpValY()
{
if(!this) { return 0;}
return &m_Y;
}
void GetpValue(Tx*& pX,Ty*& pY)
{
if(!this) { return;}
pX = &m_X;
pY = &m_Y;
}
void GetpValue(Tx*& pX,Ty*& pY,int& nSize)
{
GetpValue(pX,pY);
CFifo::GetValue(nSize);
}
void GetValue(Tx& X,Ty& Y)
{
if(!this) { return;}
X = m_X;
Y = m_Y;
}
void GetValue(Tx& X,Ty& Y,int& nSize)
{
GetValue(X,Y);
CFifo::GetValue(nSize);
}
void SetValue(Tx X)
{
if(!this) { return;}
m_X = X;
}
void SetValue(Tx X,Ty Y)
{
if(!this) { return;}
m_X = X;
m_Y = Y;
}
void SetValue(Tx X,Ty Y,int nSize)
{
SetValue(X,Y);
CFifo::SetValue(nSize);
}
};
template<class Tx,class Ty>
class CFifoXY : public CFifo
{
protected:
CFifo* m_r[2];
Tx m_X;
Ty m_Y;
CFifo** get_r() //獲取子樹指針;
{
if(!this) return 0;
return m_r;
}
public:
//缺省構(gòu)造器內(nèi)未對(duì)所有成員變量初始化,
//需要釋放指針時(shí)為防止調(diào)用pClearX或pClearY函數(shù)出錯(cuò),
//需要對(duì)調(diào)用點(diǎn)的成員變量進(jìn)行設(shè)置0值或new分配的對(duì)象;
CFifoXY() : CFifo(0)
{
m_r[0] = 0;
m_r[1] = 0;
//m_X = X; //缺省參數(shù)有可能類型不匹配;
//m_Y = Y; //缺省參數(shù)有可能類型不匹配;
}
CFifoXY(Tx X,Ty Y) : CFifo(0)
{
m_r[0] = 0;
m_r[1] = 0;
m_X = X;
m_Y = Y;
}
~CFifoXY()
{
try
{
}
catch(...)
{
}
Clear();
}
//兩查找函數(shù)等效,比較靜態(tài)函數(shù)和非靜態(tài)函數(shù)區(qū)別!!靜態(tài)函數(shù)傳入調(diào)用點(diǎn)!只要在遞歸的過程中有返回,函數(shù)返回;
CFifoXY* Find(int& h,const Tx X,const Ty Y,bool bXorY = true) //初始傳入深度0;
{
if( bXorY&&m_X==X || !bXorY&&m_Y==Y ) return this;
if( m_nSize>0 )
{
CFifoXY* o2 = GetFirst();
for(int i=0;i<m_nSize;i++)
{
h++;
CFifoXY* ol = o2->Find(h,X,Y,bXorY);
if(ol) return ol; //不能以ol和o2 相等做判斷!(最終遞歸返回不同于當(dāng)前深度)
h--;
o2 = o2->Next();
}
}
return 0;
}
static CFifoXY* Find(CFifoXY* o1,const Tx X,const Ty Y,bool bXorY = true)
{
if( bXorY&&o1->m_X==X || !bXorY&&o1->m_Y==Y ) return o1;
if(o1->GetSize())
{
CFifoXY* o2 = o1->GetFirst();
for(int i1=0;i1<o1->GetSize();i1++)
{
CFifoXY* ol = Find(o2,X,Y,bXorY);
if(ol) return ol; //不能以ol和o2相等做判斷!(最終遞歸返回不同于當(dāng)前深度)
o2 = o2->Next();
}
}
return 0;
}
static void Cpy(CFifoXY* Source,CFifoXY* Dest)
{ //從根節(jié)點(diǎn)開始;
if(Source==0||Dest==0) return;
Dest->SetValX( *Source->GetpValX() );
Dest->SetValY( *Source->GetpValY() );
if(!Source->GetSize() ) return;
const int size = Source->GetSize();
CFifoXY* o0,* o1 = Source->GetFirst();
for(int k=0;k<size;k++)
{
o0 = Dest->rpush(); //size會(huì)自動(dòng)計(jì)算;
Cpy( o1,o0 );
o1 = o1->Next();
}
}
//從樹狀隊(duì)列賦值到線型隊(duì)列:
static void Cpy1(CFifoXY* Source,CFifoY<Tx,Ty>* Dest,bool bRev=true) //隊(duì)列是正向還是逆向存儲(chǔ)參數(shù)!
{ //從根節(jié)點(diǎn)開始;
if(Source==0||Dest==0) return;
CFifoY<Tx,Ty>* o = bRev? Dest->lpush() : Dest->rpush();
o->SetValX( *Source->GetpValX() );
o->SetValY( *Source->GetpValY() );
if(!Source->GetSize() ) return;
const int size = Source->GetSize();
CFifoXY* o1 = Source->GetFirst();
for(int k=0;k<size;k++)
{
Cpy1( o1,Dest,bRev ); //警告:圖在靜態(tài)遞歸函數(shù)內(nèi)使用靜態(tài)變量;因?yàn)椴皇敲看伍_始調(diào)用時(shí)都執(zhí)行對(duì)該靜態(tài)變量的初始化操作!!
o1 = o1->Next();
}
}
void pClearX(bool bArr=false) //%/指針型值域,對(duì)象在Clear-函數(shù)前調(diào)用;
{
if(!bArr) delete ((CFifoXY*)this)->m_X;
else delete [] ((CFifoXY*)this)->m_X;
if( this&&GetFirst() ) //%/原始為:(*(_r+1));
{
CFifo* p,* q = GetFirst(); //%/原始為:(*(_r+1));
while( q )
{
p = q;
q = q->Next(); //%/原始為:q = q->m_t[0];
((CFifoXY*)p)->pClearX(bArr); //派生類;
}
}
}
void pClearY(bool bArr=false) //%/指針型值域,對(duì)象在Clear-函數(shù)前調(diào)用;
{
if(!bArr) delete ((CFifoXY*)this)->m_Y;
else delete [] ((CFifoXY*)this)->m_Y;
if( this&&GetFirst() ) //%/原始為:(*(_r+1));
{
CFifo* p,* q = GetFirst(); //%/原始為:(*(_r+1));
while( q )
{
p = q;
q = q->Next(); //%/原始為:q = q->m_t[0];
((CFifoXY*)p)->pClearY(bArr); //派生類;
}
}
}
CFifoXY* GetFirst(bool bHead= true)
{
return (CFifoXY*)CFifo::GetFirst(bHead);
}
CFifoXY* Next (bool bHead= true)
{
return (CFifoXY*)CFifo::Next (bHead);
}
//將其它隊(duì)列中剪切下來的節(jié)點(diǎn)插入到當(dāng)前隊(duì)列中-函數(shù)1:
CFifoXY* rpush(CFifo* o)
{
return (CFifoXY*)CFifo::rpush( o );
}
//將其它隊(duì)列中剪切下來的節(jié)點(diǎn)插入到當(dāng)前隊(duì)列中-函數(shù)2:
CFifoXY* lpush(CFifo* o)
{
return (CFifoXY*)CFifo::lpush( o );
}
//缺省push函數(shù):
CFifoXY* rpush()
{
return (CFifoXY*)CFifo::rpush( new CFifoXY() );
}
CFifoXY* lpush()
{
return (CFifoXY*)CFifo::lpush( new CFifoXY() );
}
CFifoXY* rpush(Tx X,Ty Y)
{
return (CFifoXY*)CFifo::rpush( new CFifoXY(X,Y) );
}
CFifoXY* lpush(Tx X,Ty Y)
{
return (CFifoXY*)CFifo::lpush( new CFifoXY(X,Y) );
}
CFifoXY* lpop()
{
return (CFifoXY*)CFifo::lpop();
}
CFifoXY* rpop()
{
return (CFifoXY*)CFifo::rpop();
}
void GetValue(Tx*& pX,Ty*& pY)
{
if(!this) { return;}
pX = &m_X;
pY = &m_Y;
}
Tx* GetpValX()
{
if(!this) { return 0;}
return &m_X;
}
Ty* GetpValY()
{
if(!this) { return 0;}
return &m_Y;
}
Tx GetValX()
{
return m_X;
}
Ty GetValY()
{
return m_Y;
}
void SetValX(Tx X)
{
if(!this) { return;}
m_X = X;
}
void SetValY(Ty Y)
{
if(!this) { return;}
m_Y = Y;
}
void GetValue(Tx& X,Ty& Y)
{
if(!this) { return;}
X = m_X;
Y = m_Y;
}
void SetValue(Tx X,Ty Y)
{
if(!this) { return;}
m_X = X;
m_Y = Y;
}
};
////////////////////////////////////////////////////////////////////////////////////////////////
//定義標(biāo)準(zhǔn)數(shù)組隊(duì)列類:
template<class Tx>
class CFifoA : public CFifo
{
protected:
Tx* m_arr;
int m_len;
void SetValue(Tx* c ,int l ,bool bCreate)
{
if(!bCreate) delete [] m_arr;
m_arr = 0;
m_len = 0;
if(l>0)
try
{
int i;
m_arr = new Tx[l];
m_len = l;
for(i=0;i<l;i++)m_arr[i] = c[i];
}
catch(...)
{
}
}
public:
CFifoA(Tx* c=0,int l=0,int nSize=0) : CFifo(nSize)
{
SetValue(c,l, true);
}
~CFifoA()
{
try
{
delete [] m_arr; m_arr = 0; m_len = 0;
}
catch(...)
{
}
Clear();
}
CFifoA* GetFirst(bool bHead= true)
{
return (CFifoA*)CFifo::GetFirst(bHead);
}
CFifoA* Next (bool bHead= true)
{
return (CFifoA*)CFifo::Next (bHead);
}
CFifoA* rpush(Tx* c=0,int l=0,int nSize=0)
{
return (CFifoA*)CFifo::rpush( new CFifoA(c,l,nSize) );
}
CFifoA* lpush(Tx* c=0,int l=0,int nSize=0)
{
return (CFifoA*)CFifo::lpush( new CFifoA(c,l,nSize) );
}
CFifoA* lpop()
{
return (CFifoA*)CFifo::lpop();
}
CFifoA* rpop()
{
return (CFifoA*)CFifo::rpop();
}
void GetValue(Tx*& c,int& l)
{
if(!this) { c=0;l=0; return;}
c = m_arr;
l = m_len;
}
void GetValue(Tx*& c,int& l,int& nSize)
{
CFifo::GetValue(nSize);
GetValue(c,l);
}
void SetValue(Tx* c,int l)
{
SetValue(c,l,false);
}
void SetValue(Tx* c,int l,int nSize)
{
CFifo::SetValue(nSize);
SetValue(c,l); //使用上一函數(shù)代碼;
}
};
////////////////////////////////////////////////////////////////////////////////////////////////
//存儲(chǔ)一個(gè)字符串隊(duì)列類:(補(bǔ)空字符)
class CFifo1 : public CFifo
{
protected:
char* m_arr;
int m_len;
void SetValue(char* c ,int l ,bool bCreate)
{
if(!bCreate) delete [] m_arr;
if(l<0) l = 0;
try
{
int i;
m_arr = new char[l+1]; m_arr[l] = 0;
m_len = l;
for(i=0;i<l;i++) m_arr[i] = c[i];
}
catch(...)
{
}
}
public:
CFifo1(char* c=0,int l=0,int nSize=0) : CFifo(nSize)
{
SetValue(c,l, true);
}
~CFifo1()
{
try
{
delete [] m_arr; m_arr = 0; m_len = 0;
}
catch(...)
{
}
Clear();
}
CFifo1* GetFirst(bool bHead= true)
{
return (CFifo1*)CFifo::GetFirst(bHead);
}
CFifo1* Next (bool bHead= true)
{
return (CFifo1*)CFifo::Next (bHead);
}
CFifo1* rpush(char* c=0,int l=0,int nSize=0)
{
return (CFifo1*)CFifo::rpush( new CFifo1(c,l,nSize) );
}
CFifo1* lpush(char* c=0,int l=0,int nSize=0)
{
return (CFifo1*)CFifo::lpush( new CFifo1(c,l,nSize) );
}
CFifo1* lpop()
{
return (CFifo1*)CFifo::lpop();
}
CFifo1* rpop()
{
return (CFifo1*)CFifo::rpop();
}
void GetValue(char*& c,int& l)
{
if(!this) { c=0;l=0; return;}
c = m_arr;
l = m_len;
}
void GetValue(char*& c,int& l,int& nSize)
{
nSize = CFifo::GetvSize();
GetValue(c,l);
}
void SetValue(char* c,int l)
{
SetValue(c,l,false);
}
void SetValue(char* c,int l,int nSize)
{
CFifo::SetvSize(nSize);
SetValue(c,l); //使用上一函數(shù)代碼;
}
};
//存儲(chǔ)兩個(gè)字符串的隊(duì)列類:(補(bǔ)空字符)
class CFifo2 : public CFifo1
{
protected:
char* m_str;
int m_siz;
void SetValue(char* s ,int z ,bool bCreate)
{
if(!bCreate) delete [] m_str;
if(z<0) z = 0;
try
{
int i;
m_str = new char[z+1]; m_str[z] = 0;
m_siz = z;
for(i=0;i<z;i++) m_str[i] = s[i];
}
catch(...)
{
}
}
public:
CFifo2(char* c=0,int l=0,char* s=0,int z=0,int nSize=0) : CFifo1(c,l,nSize)
{
SetValue(s,z, true);
}
~CFifo2()
{
try
{
delete [] m_str; m_str = 0; m_siz = 0;
}
catch(...)
{
}
Clear();
}
CFifo2* GetFirst(bool bHead= true)
{
return (CFifo2*)CFifo::GetFirst(bHead);
}
CFifo2* Next (bool bHead= true)
{
return (CFifo2*)CFifo::Next (bHead);
}
CFifo2* rpush(char* c=0,int l=0,char* s=0,int z=0,int nSize=0)
{
return (CFifo2*)CFifo::rpush( new CFifo2(c,l,s,z,nSize) );
}
CFifo2* lpush(char* c=0,int l=0,char* s=0,int z=0,int nSize=0)
{
return (CFifo2*)CFifo::lpush( new CFifo2(c,l,s,z,nSize) );
}
CFifo2* lpop()
{
return (CFifo2*)CFifo::lpop();
}
CFifo2* rpop()
{
return (CFifo2*)CFifo::rpop();
}
void GetValue(char*& c,int& l)
{
CFifo1::GetValue(c,l);
}
void GetValue(char*& c,int& l,char*& s,int& z)
{
GetValue(c,l);
if(!this) { s=0;z=0; return;}
s = m_str;
z = m_siz;
}
void GetValue(char*& c,int& l,char*& s,int& z,int& nSize)
{
nSize = CFifo::GetvSize();
GetValue(c,l,s,z);
}
void SetValue(char* c,int l,char* s,int z)
{
CFifo1::SetValue(c,l,false);
SetValue(s,z,false);
}
void SetValue(char* c,int l,char* s,int z,int nSize)
{
nSize = CFifo::GetvSize();
SetValue(c,l,s,z); //使用上一函數(shù)代碼;
}
};
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -