锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
#include<deque>
#include <ctime>
using namespace std;
template<class _Ty, class _C = deque<_Ty> >
class zlfStack {
public:
typedef unsigned _Ty;
typedef _C::allocator_type allocator_type;
typedef _C::value_type value_type;
typedef _C::size_type size_type;
typedef _C::iterator zlfIterator;
protected:
_C c;
public:
inline
const value_type& zlfTop2(){
return *(c.end()-2);
}
inline
const value_type& zlfTop3(){
return *(c.end()-3);
}
inline
void top_3(value_type& x,value_type& y,value_type& b)
{
b=*(c.end()-1);
y=*(c.end()-2);
x=*(c.end()-3);
}
inline
void top_2(value_type& x,value_type& y)
{
y=*(c.end()-2);
x=*(c.end()-3);
}
//zlfStack(){ }
explicit zlfStack(const allocator_type& _Al = allocator_type())
:c(_Al){}
allocator_type get_allocator() const
{return (c.get_allocator()); }
bool empty() const
{return (c.empty()); }
size_type size() const
{return (c.size()); }
value_type& top()
{return (c.back()); }
const value_type& top() const
{return (c.back()); }
void push(const value_type& _X)
{c.push_back(_X); }
inline
void push_3(const value_type& x,const value_type& y,const value_type& b)
{
c.push_back(x);
c.push_back(y);
c.push_back(b);
}
inline
void pop()
{c.pop_back(); }
};///
enum{B0=0,B1=1,B2=2,B3=3};
int A(unsigned x,unsigned y)
{
static count=0;
if (!x&&!y) {return ++count;return count;}
if (x==0xffff) {count=0;return 0;}
if (x) A(--x,y);
AB1: if(y) A(x,--y);
AB2:
return count;
}
inline
void clear(){A(0xffff,0);}
zlfStack<unsigned> s;
inline
void push(unsigned x,unsigned y,unsigned b)
{
s.push(x);
s.push(y);
s.push(b);
}
inline
void pop(unsigned& x,unsigned& y,unsigned& b)
{
b=s.top();
s.pop();
// y=s.top();
s.pop();
// x=s.top();
s.pop();
}
int main()
{
unsigned x=1,y=1,b=1,c=0,z=0;
unsigned temp=0;
clock_t t1,t2;
unsigned k=1;
unsigned long sum1=0,sum2=0,time1=0,time2=0;
cout<<"AAAA"<<endl;
t1=clock();
for (x=1;x<10;x++) {
for (y=1;y<10;y++) {
clear();
k=A(x,y);
sum1+=k;
cout<<k<<" ";
cout<<"x="<<x<<" "<<"y="<<y<<endl;
}
}
t2=clock();
time1=t2-t1;
cout<<endl;
if (!x&&!y) return 0;//exit
sum2 = 0;
t1=clock();
for (x=1;x<10;x++) {
for (y=1;y<10;y++) {// push(x,y,B3);
s.push_3(x,y,B3);
c=0;
b=B0;
while (!s.empty()) {
switch(b) {
case B0:if(x) {//push(--x,y,B1);
s.push_3(--x,y,B1);
b=B0;continue;}
case B1:if(y) {//push(x,--y,B2);
s.push_3(x,--y,B2);
b=B0;continue;}
case B2:if (!x&&!y) c++;
default:;
}//switch
// pop(x,y,b);
b=s.top();
s.pop();
s.pop();
s.pop();
if(b==B3) break;//return to main
// pop(x,y,temp);
// push(x,y,temp);
// y=s.zlfTop2();
// x=s.zlfTop3();
s.top_2(x,y);
}//while
sum2+=c;
// cout<<"c="<<c<<" "<<"x="<<x<<" "<<"y="<<y<<endl;
}//y
}//x
t2=clock();
time2=t2-t1;
cout<<"time used :"<<time2<<"ms"<<endl;
cout<<"routines :"<<sum2<<endl;
cout<<endl<<endl;
double t;
cout<<"routines: "<<sum1<<" time1: "<<time1<<endl;
t=sum1/time1;
cout<<t<<" rps"<<endl;
cout<<"routines: "<<sum2<<" time2: "<<time2<<endl;
t=sum2/time2;
cout<<t<<" rps"<<endl;
return 0;
}
http://www.baidu.com/s?wd=%D4%AA%CB%D1%CB%F7&rn=100&pn=10 //絎簩欏祊n
http://www.yahoo.cn/s?p=%E5%85%83%E6%90%9C%E7%B4%A2&b=10 //絎簩欏礲
http://search.yahoo.com/search?n=100&p=%E5%85%83%E6%90%9C%E7%B4%A2&b=101
http://cnweb.search.live.com/results.aspx?q=%E5%85%83%E6%90%9C%E7%B4%A2&first=51 //絎簩欏礷irst=51
http://p.zhongsou.com/p?w=%D4%AA%CB%D1%CB%F7&b=3 //b=3琛ㄧず絎笁欏?/p>
http://www.soso.com/q?w=%D4%AA%CB%D1%CB%F7&num=20&pg=1 //絎竴欏碉紝姣忛〉20涓?br>
絎簩姝ユ槸瑙i噴鎼滅儲緇撴灉欏甸潰錛?br>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
Google
鎼滅儲緇撴灉涓暟鐨勫瓧絎︿覆鍓嶇紑錛氱害鏈?lt;b> //鑾峰彇涓暟鐢ㄥ瓧絎︿覆瀹氫綅鐨勬柟寮?br>鎼滅儲緇撴灉寮濮嬬殑鏍囩錛?lt;div id=res> //涔熷彲浠ョ敤瀛楃涓插畾浣嶇殑鏂瑰紡錛岃鍑嗙‘灝辯敤鏌ユ壘鏍囩瀹氫綅鐨勬柟寮?br> 鍚勪釜鎼滅儲緇撴灉鐨勫紑濮嬫爣絳撅細<div class=g> //瀛楃涓插畾浣嶇殑鏂瑰紡
鎼滅儲緇撴灉鐨剈rl鍦ㄧ涓涓?lt;a target=_blank class=l>鏍囩閲屽ご
鎼滅儲緇撴灉鐨勬爣棰樺湪<a></a>鐨勬爣絳句箣闂?/p>
鎼滅儲緇撴灉鐨勬憳瑕佸湪鎺ヤ笅鏉ョ殑<table><tr><td>鏍囩閲屽ご鐩村埌<b>...<b><br>
鎼滅儲緇撴灉鐨勯噸鍐欑殑url鍦?lt;b>...<b><br>涔嬪悗鐨?lt;span>鏍囩閲屽ご錛屾牸寮忎負錛歶rl錛屼竴涓┖鏍鹼紝緗戦〉澶у皬
鎼滅儲緇撴灉鐨勭綉欏靛揩鐓у湪鎺ヤ笅鏉ョ殑<a class=fl>鐨勬爣絳鵑噷澶達紝灞炴т腑鏈塽rl,鏍囩涔嬮棿鏈夌綉欏靛揩鐓ф枃瀛?br> 鎺ヤ笅鏉ヨ繕鏈夌被浼肩綉欏電瓑錛岄兘鍦?lt;a class=fl>鏍囩閲屽ご
鍚勪釜鎼滅儲緇撴灉鐨勭粨鏉熸爣絳炬槸</td></tr></table></div>
......................
鐩稿叧鎼滅儲鐨勫紑濮嬫爣絳撅細<p class=e>
鍦ㄦ帴涓嬫潵鐨勫悇涓?lt;a></a>鏍囩涔嬮棿鐨勫唴瀹瑰氨鏄浉鍏蟲悳绱㈢殑鍐呭
鐩村埌鏍囩<br clear=all>灝卞彲浠ョ粨鏉熶簡
Baidu
鎼滅儲緇撴灉涓暟鐨勫瓧絎︿覆鍓嶇紑錛?lt;td align=\"righ錛屽湪瀹氫綅璇ュ瓧絎︿覆鍚庯紝鐩村埌</td>,鍗沖湪榪欎釜td鏍囩涔嬪唴鍚湁鐨勫瓧絎︿覆鍖呭惈鐩稿叧緗戦〉鏁板拰鐢ㄦ椂
鎼滅儲緇撴灉寮濮嬬殑鏍囩錛?lt;DIV id=ScriptDiv></DIV>
鍚勪釜鎼滅儲緇撴灉鐨勫紑濮嬫爣絳撅細<table
鎼滅儲緇撴灉鐨剈rl鍦ㄧ涓涓?lt;a target=_blank class=l>鏍囩閲屽ご
鎼滅儲緇撴灉鐨勬爣棰樺湪<a></a>鐨勬爣絳句箣闂?浠?lt;br>鏍囩緇撴潫
鎼滅儲緇撴灉鐨勬憳瑕佷互<br>寮濮嬬洿鍒頒笅涓涓?lt;br>鏍囩
鎺ヤ笅鏉ョ殑涓琛岋紙<br>鎹㈣錛夌殑font鏍囩涓湁鎼滅儲緇撴灉url鐨勯噸鍐欙紝涓涓┖鏍鹼紝緗戦〉澶у皬錛岀綉欏墊椂闂?br> 鍦ㄦ帴涓嬫潵浼氭湁涓浜?lt;a>鏍囩濡傜櫨搴﹀揩鐓э紝鐩村埌鍙堜竴涓?lt;br>
鐒跺悗鎼滅儲緇撴灉鐨勭粨鏉熸爣絳?lt;/table>
.........................
瀵艱埅鏉$殑寮濮嬫爣絳撅細<br clear=all>
瀵艱埅鏉$殑鍐呭鍦ㄥ紑濮嬫爣絳句箣鍚庣殑<div class="p"></div>鏍囩涔嬮棿
鐩稿叧鎼滅儲鍦ㄦ帴涓嬫潵鐨?lt;div>鏍囩涔嬮棿鐨勫悇涓?lt;a>鏍囩涔嬪唴
鍏朵粬鑰冭檻錛氬浜庡瓧絎︿覆鐨勫尮閰嶅彲浠ュ埄鐢╧mp錛屾敞鎰忓埌鍖歸厤鎼滅儲緇撴灉鍚勯儴鍒嗙殑鏃跺欐墍鐢ㄥ埌鐨勬ā寮忓瓧絎︿覆鐨勬渶澶у墠緙瀛楃涓叉渶澶氭槸涓涓瓧絎︼紝榪欐牱鍙互閬垮厤姹傚彇鏈澶у墠緙瀛楃涓蹭粠鑰屾彁楂樻晥鐜囷紱濡傛灉瑕佺簿紜湴鍖歸厤榪橀渶瑕佸紕涓や釜鍑芥暟錛屼竴涓敤鏉ユ瀯閫犳爣絳撅紝涓涓敤鏉ヨ鍙栨爣絳句箣闂寸殑鏂囨湰銆?/p>
0---絀烘寚閽?/span> 7FFF---澶х儲寮曞彿鏍囧織錛屽嵆鍚庨潰鐨勭儲寮曞彿鏄?/span>32浣嶇殑
0X8000---淇濈暀浠ュ悗浣跨敤 0XFFFF---鏂扮被鐨勫畾涔?/span>
灝忕儲寮曞璞℃垨鑰呯被鐨勭儲寮曞彿:1~~~7FFE,浣嗘槸綾葷殑鏈楂樹綅鏄?/span>1
瀵硅薄鐨勬彃鍏ワ細writeobject鍑芥暟錛氾紙鍏ㄥ眬鎻掑叆<<鍑芥暟鍙槸璋冪敤浜嗚繖涓嚱鏁幫級棣栧厛鎻掑叆綾諱俊鎭紝鐒跺悗鏄璞′俊鎭傛瘡嬈″啓鍏ワ紙鍗充竴嬈?/span>writeobject鍑芥暟鐨勬墽琛屾祦紼嬶級鏄笅闈笁縐嶇殑涔嬩竴錛?/span>
1 鑻ユ槸鏈啓榪囩殑綾誨茍涓旀湭琚啓榪囩殑瀵硅薄錛?/span>
1.1 鍐欏叆鏂扮被鏍囧織錛?/span>0XFFFF *this << wNewClassTag;
1.2 鍐欏叆綾葷殑鐗堟湰鍙鳳紝鍐欏叆綾誨悕鐨勫瓧絎︿覆闀垮害錛?/span>ar << (WORD)m_wSchema << nLen;
1.3 鍐欏叆綾誨悕 ar.Write(m_lpszClassName, nLen*sizeof(char));
1.4 鍐欏叆瀵硅薄 ((CObject*)pOb)->Serialize(*this);
2 鑻ユ槸鏇劇粡鍐欒繃鐨勭被騫朵笖鏈啓榪囩殑瀵硅薄錛?/span>
2.1 鍐欏叆綾葷殑绱㈠紩鍙?/span> nClassIndex = (DWORD)(*m_pStoreMap)[(void*)pClassRef]
濡傛灉鏄皬绱㈠紩綾伙細鍒欏啓鍏ョ被*this << (WORD)(wClassTag | nClassIndex);
濡傛灉鏄ぇ绱㈠紩綾伙細鍒欏啓鍏ュぇ绱㈠紩鍙鋒爣蹇楋紙7FFF錛夊拰32浣嶇殑綾葷儲寮曞彿錛堟渶楂樹綅鏄?/span>1錛?/span> *this << wBigObjectTag;
*this << (dwBigClassTag | nClassIndex);
2.2 鍐欏叆瀵硅薄 ((CObject*)pOb)->Serialize(*this);
3 鑻ユ槸鏇劇粡鍐欒繃鐨勭被騫朵笖鏇劇粡鍐欒繃鐨勫璞★細
3.1 鍐欏叆瀵硅薄鐨勭儲寮曞彿
濡傛灉鏄皬绱㈠紩瀵硅薄錛氬垯鐩存帴鍐欏叆绱㈠紩鍙?/span>*this << (WORD)nObIndex;
濡傛灉鏄ぇ绱㈠紩瀵硅薄錛氬垯鍐欏叆澶х儲寮曞彿鏍囧織鍜?/span>32浣嶇殑瀵硅薄绱㈠紩鍙鳳紙鏈楂樹綅鏄?/span>0錛?/span>
*this << wBigObjectTag;
*this << nObIndex;
浠ヤ笂3縐嶆儏鍐電殑鍐欏叆閮芥槸棣栧厛鍐欏叆涓涓瓧錛岃繖涓瓧鐨勫唴瀹瑰氨浠h〃浜嗕箣鍚庡瓧鑺傚嵆綾諱俊鎭殑鎰忎箟鎴栬呭彲浠ュ彧鏄竴涓璞$殑绱㈠紩鍙鳳紙鎯呭喌涓夛級錛屽嵆鏄柊綾伙紙瀛楄妭涓?/span>0xFFFF錛夎繕鏄凡緇忓畾榪囩殑灝忕儲寮曠被錛堢儲寮曞彿浠?/span>0x8001鈥?xFFFE錛夊張鎴栬呮槸宸茬粡瀹氫箟榪囩殑澶х儲寮曠被浠?/span>(瀛楄妭0x7FFF鍚庣畫涓や釜瀛楄妭涓虹儲寮曞彿)銆?/span>
瀵逛簬璇誨彇涓婇潰鏂囦歡鏍煎紡鐨勪俊鎭茍涓斿尯鍒嗗嚭灝嗚璇誨彇鐨勬槸綾昏繕鏄璞★紝鏄儲寮曡繕鏄璞℃暟鎹紝鍦?/span>readObject涓?/span>
棣栧厛璇誨彇涓涓瓧濡傛灉鏄?/span>0XFFFF鍒欐樉鐒跺搴旂殑鏄涓縐嶆儏鍐碉紝姝ゆ椂鍙互瀹規槗鍦拌鍙栨暟鎹紱濡傛灉絎竴涓瓧鐨勬渶楂樹綅鏄?/span>1鐨勮瘽錛屽緢鏄劇劧姝ゆ椂瀵瑰簲鐨勫氨鏄浜岀鎯呭喌錛屽嵆璇ュ瓧鏄竴涓被鐨勭儲寮曞彿錛岃屼笖鏄皬绱㈠紩綾伙紱濡傛灉鏄?/span>0x7FFF鍒欐鏃跺搴旂殑灝辨槸絎笁縐嶆儏鍐靛ぇ绱㈠紩鍙峰璞℃垨鑰呯浜岀鎯呭喌澶х儲寮曞彿綾伙紱濡傛灉鏈楂樹綅涓嶆槸1鍒欐鏃跺搴旂殑涔熸槸絎笁縐嶆儏鍐典絾鏄皬绱㈠紩瀵硅薄錛涘湪鍖哄垎浜嗙涓涓瓧浠ュ悗灝卞彲浠ュ鏄撳湴璇誨彇鍚庨潰鐨勬暟鎹傝繖鏍鋒瘡嬈$殑readObject鍑芥暟鐨勮皟鐢ㄩ兘鍙槸鎻愬彇浠ュ線鏌愭writeObject鍑芥暟鍐欏叆鐨勬暟鎹?/span>
瀵硅薄鐨勬彁鍙?/span>:ReadObject鍑芥暟錛屽洜涓哄湪瀹?/span>IMPLEMENT_SERIAL閲屽畾涔夌殑鎻愬彇鎿嶄綔絎﹀彧鏄畝鍗曞湴璋冪敤浜嗚繖涓嚱鏁般傞鍏堟彁鍙栫被淇℃伅錛屼互渚挎紜湴鍔ㄦ佺敓鎴愬璞★紝鐒跺悗鏄璞′俊鎭?/span>
PS:m_pStoreMap閲屽嵆鍖呭惈浜嗗凡緇忓簭鍒楀寲鐨勭被錛?/span>CRuntimeClass錛夊拰瀵硅薄鐨勬寚閽堛?/span>
UINT CArchive::GetObjectSchema()鍑芥暟鍙兘璋冪敤涓嬈★紝涓鑸鍑芥暟鍦ㄦ煇涓被錛?/span>ar姝e湪搴忓垪鍖栫殑綾伙級鐨?/span>Serialize鍑芥暟閲屽ご璋冪敤錛屽畠榪斿洖璇誨彇鐨勭被鐨勭増鏈彿銆備互涓嬪嚑琛屾潵鑷?/span>readObject:
UINT nSchemaSave = m_nObjectSchema;
m_nObjectSchema = nSchema;
pOb->Serialize(*this);
m_nObjectSchema = nSchemaSave;
涓鑸湴錛屼篃姝f槸鍦?/span>serialize閲屽ご鏉ュ鐞嗗悇縐嶇増鏈殑搴忓垪鍖栥?/span>
FAQ:
1錛?nbsp;涓轟粈涔堝彲浠ュ畾涔夊叏灞鐨勬彃鍏ユ搷浣滅錛岃屾彁鍙栨搷浣滅鍗磋瀵規瘡涓被鍦ㄥ畯閲屽ご澹版槑錛?/span>
鎻掑叆鎿嶄綔鐨勬槸鍦ㄥ凡鐭ュ璞℃墍鏈変俊鎭殑鎯呭喌涓嬬殑鎿嶄綔錛屽寘鎷璞$殑綾誨瀷鍜岀姸鎬侊紝綾諱俊鎭殑鍐欏叆浣跨敤CruntimeClass闈為潤鎬?/span>鎴愬憳鍑芥暟Store鏉ュ疄鐜扮殑錛岃?/span>GetCRuntime鎴愬憳鍑芥暟鍙堟槸铏氬嚱鏁版墍浠ュ彲浠ョ敤鎸囧悜COBJECT鐨勬寚閽堟潵姝g‘鍦拌幏鍙栵紝鐒跺悗姝g‘鍦拌皟鐢?/span>STORE鍑芥暟錛涜屽浜庢彁鍙栨搷浣滐紝灝嗚鎻愬彇鍑虹殑瀵硅薄鐨勭被鍨嬪拰鐘舵侀兘鏄湭鐭ワ紝鎻愬彇綾諱俊鎭富瑕佹槸鐢?/span>CruntimeClass鐨?/span>闈欐?/span>鎴愬憳LOAD鏉ヨ幏鍙栵紝璇ユ垚鍛樿幏寰楁枃浠朵腑綾諱俊鎭箣鍚庨氳繃鏌ユ壘鍏ㄥ眬鐨勭被鍨嬮摼琛ㄥ彲浠ュ敮涓鍦扮‘瀹氫竴涓?/span>CrutimeClass綾誨瀷鐨勯潤鎬佸璞★紝閫氳繃璇ュ璞$殑createObject鍑芥暟鍙互鏋勯犲嚭鍗沖皢鎻愬彇鐨勫璞$被鍨嬶紝鐒跺悗鍒╃敤鍔ㄦ佹瀯閫犵殑瀵硅薄鐨勫簭鍒楀寲鍑芥暟灝卞彲浠ユ紜湴鎻愬彇鍑哄璞★紝鍥犱負
1錛?/span>1 鍦ㄥ畯瀹氫箟鐨勬彁鍙栨搷浣滅涓?/span>classname鍙傛暟鏄棤娉曠敤COBJECT綾繪潵鏇挎崲錛屽洜涓哄鏋滄浛鎹㈢殑璇濆垯鍦ㄦ彁鍙栦俊鎭繃紼嬩腑鍗充嬌鍑虹幇閿欒錛屾瘮濡傝鎻愬彇鍑虹殑綾誨瀷鏍規湰灝變笉鏄彲搴忓垪鍖栫殑浣嗘槸濡傛灉緇ф壙鑷?/span>COBJECT鐨勮瘽浠嶇劧鍙互閫氳繃閿欒媯鏌ャ?/span>
bool operator < (E& e){ return data < e; }
bool operator > (E& e){ return data > e; }
bool operator == (E& e){ return data == e; }
bool operator != (E& e){ return data != e; }
E getdata(){return data;}
E data;
int depth;
AVL_NODE<E> *ln,*rn;
};
public:
typedef E dataType;
typedef AVL_TMP<E> Myt;
typedef AVL_NODE<E> n;
typedef n* npos;
typedef npos iterator;
enum unbalanceType {LL,RR,LR,RL};
AVL_TMP():root(0),size(0),depth(-1){}
~AVL_TMP(){ if(root) delete root; }
iterator begin(){return root;}
bool insert(const E& e);
npos find(const E& e);
npos findpre(const E& e);
bool del(dataType);
bool balance(AVL_TMP<E>::iterator pos){
if(pos == NULL) throw 0;
int lh,rh;
if(pos->ln == NULL ) lh = -1;
else lh = pos->ln->depth;
if(pos->rn == NULL ) rh = -1;
else rh = pos->rn->depth;
return abs( lh - rh ) < 2 ;
}
virtual void frontOrder(){};
virtual void midOrder(){ };
protected:
void LLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
void LRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
void RRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
void RLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
void updateDepth(AVL_TMP<E>::iterator pos);
bool delAux(E const& e,AVL_TMP<E>::iterator pos = NULL);
iterator findMax(iterator );
iterator findMin(iterator );
bool upTree(int iDepth,iterator itRoot,unsigned long iSize){depth = iDepth;root = itRoot;size = iSize; return true;}
bool upRoutineDepth(vector<iterator>&);
bool adjust(iterator a,iterator b,iterator c,iterator prePos = NULL);
npos root;
int depth;
unsigned long size;
};
template<typename E>
bool AVL_TMP<E>::adjust(iterator a,iterator b,iterator c,iterator prePos){
bool b1,b2;
b1 = b == a->ln;
b2 = c == b->ln;
unbalanceType ub;
if(b1&&!b2) ub = LR;
if(!b1&&b2) ub = RL;
if(b1&&b2) ub = LL;
if(!b1&&!b2) ub = RR;
switch(ub) {
case LL :LLr(a,prePos);
break;
case LR :LRr(a, prePos);
break;
case RR :RRr(a,prePos);
break;
case RL :RLr(a,prePos);
break;
} //end switch
return true;
}
template<typename E>
bool AVL_TMP<E>::upRoutineDepth(vector<iterator>&routine){
//璇ュ嚱鏁頒富瑕佹槸灝嗚礬寰勮妭鐐圭殑娣卞害鏇存柊騫朵笖浣垮緱閭d簺涓嶅鉤琛$殑鑺傜偣騫寵
int size = routine.size();
while (size--) {
updateDepth(routine[size]);
if (!balance(routine[size])) {//涓嶅鉤琛″緱璋冩暣
iterator cur = routine[size],prePos = NULL;
if(size-1>=0)
prePos = routine[size-1];
//媯鏌ュ綋鍓嶄笉騫寵 鑺傜偣鐨勫摢棰楀瓙鏍戠殑楂樺害鏇撮珮
bool bl = cur->ln != NULL;
bool br = cur->rn != NULL;
if (!bl) {//鑲畾鏈夊彸瀛╁瓙
if(cur->rn->ln) RLr(cur,prePos);
else RRr(cur,prePos);
}
else{//鏈夊乏瀛╁瓙
if (!br) {//娌″彸瀛╁瓙
if (cur->ln->ln) LLr(cur,prePos);
else LRr(cur,prePos);
}
else{ //鏈夊彸瀛╁瓙,姝ゆ椂闇瑕佹鏌ュ乏鍙沖瀛愮殑楂樺害錛屽垯鍙沖瓙鏍戦珮搴﹁嚦灝戜負1
//鍥犳宸﹀瓙鏍戦珮搴﹁嚦灝戜負3錛屽垯宸﹀瓙鏍戠殑鑺傜偣涓暟鑲畾澶т簬4
if (cur->ln->depth > cur->rn->depth) LLr(cur,prePos);
else RRr(cur,prePos);
}
}
}
}
return true;
}
template<typename E>
AVL_TMP<E>::iterator AVL_TMP<E>::findMax(AVL_TMP<E>::iterator pos){//浠os涓烘牴鐨勬爲鐨勬渶澶у肩殑鑺傜偣
if (!pos) return NULL;
iterator p = pos;
while(p->rn) p = p->rn;
return p;
}
template<typename E>
AVL_TMP<E>::iterator AVL_TMP<E>::findMin(AVL_TMP<E>::iterator pos){
iterator p = pos;
while (p->ln) p = p->ln;
return p;
}
template<typename E>
void AVL_TMP<E>::updateDepth(AVL_TMP<E>::iterator pos){
bool b1 = pos->ln == NULL,b2 = pos->rn ==NULL;
switch(b1) {
case true:
if(b2) pos->depth = 0;
else pos->depth = pos->rn->depth+1;
break;
default: //false
if(b2) pos->depth = pos->ln->depth+1;
else pos->depth = max(pos->ln->depth , pos->rn->depth )+1;
}
if(pos == root) depth = pos->depth;
}
template<typename E>
void AVL_TMP<E>::LLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos){
typename AVL_TMP<E>::iterator t, a = pos, b = t = pos->ln ;
pos->ln = t->rn;
t->rn = pos;
if(root == a) root = b;
if(prePos != NULL)
if(prePos->ln == a) prePos->ln = b;
else prePos->rn = b;
updateDepth(a);updateDepth(b);
}
template<typename E>
void AVL_TMP<E>::LRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos){
AVL_TMP<E>::iterator a = pos,b = pos ->ln, c = b->rn;
b->rn = c->ln ; a->ln = c->rn;
c->ln = b; c->rn =a;
if(a == root ) root = c ;
if(prePos != NULL)
if(prePos->ln == a) prePos->ln = c;
else prePos->rn = c;
updateDepth(a);updateDepth(b);updateDepth(c);
}
template<typename E>
void AVL_TMP<E>::RRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos ){
AVL_TMP<E>::iterator a = pos ,t, b = t = pos->rn ;
pos->rn = t->ln;
t->ln = pos;
if(prePos != NULL)
if(prePos->ln == a) prePos->ln = b;
else prePos->rn = b;
if(root == a) root = b;
updateDepth(a);updateDepth(b);
}
template<typename E>
void AVL_TMP<E>::RLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos){
AVL_TMP<E>::iterator a = pos, b = pos->rn , c = b->ln;
a->rn = c->ln ; b->ln = c->rn;
c->ln = a; c->rn = b;
if(prePos != NULL)
if(prePos->ln == a) prePos->ln = c;
else prePos->rn = c;
if( a == root) root = c;
updateDepth(a);updateDepth(b);updateDepth(c);
}
template<typename E>
bool AVL_TMP<E>::insert(const E& e){
if(root == NULL) {root = new AVL_NODE<E>(e); size++; depth = root->depth;return true;}
bool bUpdateDepth = false;
vector<AVL_TMP<E>::iterator> routin;
typename AVL_TMP<E>::iterator p = root,pos,prePos;
for (int i = 0 ; i < size ;i++ ) {
routin.push_back(p);
if(p->data > e){
if ( p->ln == NULL ) {
p->ln = pos = new AVL_NODE<E>(e);
bUpdateDepth = p->rn == NULL;
break;
}
else { p = p->ln ; continue;}
}
if(p->data < e){
if (p->rn == NULL) {
p->rn = pos = new AVL_NODE<E>(e) ;
bUpdateDepth = p->ln == NULL;
break;
}
else { p = p->rn ; continue;}
}
return false; //already exists
} //insertion finished
size++;
if(size <= 2 ) {
updateDepth(root);
return true;
}
if(!bUpdateDepth) return true; //balance
bool unAdjusted = true;
// check for balance and adjust depth
for (i = routin.size()-1; i >=0 ; i-- ) {
if(!balance(routin.at(i)))
if(unAdjusted) { // unbalance! get unbalance type
if(i-1 >= 0) prePos = routin.at(i-1);
else prePos = NULL;
AVL_TMP<E>::iterator a = routin.at(i) , b = routin.at(i+1) , c;
if(i+2 >= routin.size() ) c = pos;
else c = routin.at(i+2);
bool b1,b2;
b1 = b == a->ln;
b2 = c == b->ln;
unbalanceType ub;
if(b1&&!b2) ub = LR;
if(!b1&&b2) ub = RL;
if(b1&&b2) ub = LL;
if(!b1&&!b2) ub = RR;
switch(ub) {
case LL :LLr(routin.at(i),prePos);
break;
case LR :LRr(routin.at(i),prePos);
break;
case RR :RRr(routin.at(i),prePos);
break;
case RL :RLr(routin.at(i),prePos);
break;
} //end switch
unAdjusted = false;
} //end if
updateDepth(routin.at(i)); //update the depth of the node in the routin
depth = root->depth;
}//end for
return true;
};
template<typename E>
AVL_TMP<E>::npos AVL_TMP<E>::find(const E& e){//search for position
npos p=root;
while (p&&p->data!=e)
if(e>p->data) p=p->rn;
else p= p->ln;
return p;
}
template<typename E>
AVL_TMP<E>::npos AVL_TMP<E>::findpre(const E& e){//search for parent node position
npos p,pre;
p=pre=root;
while (p&&p->data!=e) {
pre = p;
if (e>p->data) p=p->rn;
else p = p->ln;
}
if(p) if(p->data==e) return NULL;//already existed
return pre;
}
template<typename E>
bool AVL_TMP<E>::delAux(E const& e,AVL_TMP<E>::iterator pos){
// 1.閫掑綊鍒犻櫎鑺傜偣錛岀洿鍒板垹闄ょ殑鏄彾瀛愯妭鐐?nbsp;
// 2. 鍒犻櫎鍙跺瓙鑺傜偣,鏇存柊鏍戠殑鏁版嵁鎴愬憳
// 3. 鏇存柊璺緞涓婄殑鑺傜偣娣卞害騫朵笖媯鏌ュ鉤琛″洜瀛?nbsp;
static vector<iterator> routine;
iterator p = pos;
bool bUpdate = false;
if(!pos){//絎竴嬈¤皟鐢?br> p = root;
while (p&&e!=p->data) {//鎵懼埌鑺傜偣錛屽茍涓斿皢瀵繪壘璺緞瀛樺叆琛ㄤ腑
routine.push_back(p);
if(p->data > e) p = p->ln;
else p = p->rn;
}
if(p == NULL){ //娌℃壘鍒?br> routine.clear();
return false;
}
else pos = p;
}
if (pos->ln||pos->rn) {//涓嶆槸鍙跺瓙鑺傜偣錛屽垯璇ヨ妭鐐規湁瀛╁瓙鑺傜偣錛屽彲鑳芥槸涓涓垨鑰呬袱涓?br> routine.push_back(pos);//榪樺緱寰涓嬪垹闄?br> if (pos->ln&&!pos->rn){ //鎯呭喌涓: 鍙湁鏈夊乏瀛╁瓙
//鎵懼埌宸﹀瓙鏍戜腑鐨勬渶澶у肩殑浣嶇疆
iterator max = pos->ln;
while (max->rn) { routine.push_back(max); max = max->rn;}
bUpdate = false;
//浼垹闄?br> pos->data = max->data;
delAux(max->data,max);
}
else if (!pos->ln&&pos->rn) { //鎯呭喌浜岋細鍙湁鍙沖瀛?br> //鎵懼埌鍙沖瓙鏍戜腑鐨勬渶灝忓?br> iterator min = pos->rn;
while (min->ln) { routine.push_back(min); min = min->ln;}
bUpdate = false;
//浼垹闄?br> pos->data = min->data;
delAux(min->data,min);
}
else //鎯呭喌涓夛細鏈変咯涓瀛?br> {
//鎵懼埌宸﹀瓙鏍戜腑鐨勬渶澶у?br> iterator max = pos->ln;
while (max->rn) { routine.push_back(max); max = max->rn;}
bUpdate = false;
//浼垹闄?br> pos->data = max->data;
delAux(max->data,max);
}
}
else
{//鏄彾瀛愯妭鐐?br> //鏈変笁縐嶆儏鍐碉紝鏄叾鐖惰妭鐐圭殑宸﹀瓙鏍戜笖娌℃湁鍏勫紵錛屾槸鍏剁埗鑺傜偣鐨勫彸瀛愭爲涓旀病鏈夊厔寮燂紝鏈夊厔寮?br> //鍙栧緱鍏剁埗鑺傜偣
iterator parent = NULL;
if (routine.size()) //鏈夌埗鑺傜偣
parent = routine[routine.size()-1];
else{//鍗寵鑺傜偣鏄牴鑺傜偣,鏃犳牴鑺傜偣
delete root;
routine.clear();
upTree(-1,NULL,0);
return true;
} //瀹屾垚鏍硅妭鐐圭殑鍒犻櫎
//鏈夌埗鑺傜偣
if (pos == parent->ln&&!parent->rn) {//鎯呭喌涓錛氭槸鐖惰妭鐐圭殑宸﹀瀛愪笖娌″厔寮?br> //鍒犻櫎鑺傜偣
parent->ln = NULL;
delete pos;
//闇瑕佹洿鏂拌礬寰勪笂鐨勮妭鐐圭殑娣卞害
bUpdate = true;
upRoutineDepth(routine);
upTree(root->depth,root,size-1);
routine.clear();
//鏀瑰啓鐖惰妭鐐圭殑瀛╁瓙鎸囬拡
}//瀹屾垚鎯呭喌涓鍙跺瓙鑺傜偣鐨勫垹闄?br> else{
if (pos == parent->rn && !parent->ln ) { //鎯呭喌浜岋細鏄埗鑺傜偣鐨勫彸瀛╁瓙涓旀病鍏勫紵
parent->rn = NULL;
delete pos;
bUpdate = true;
upRoutineDepth(routine);
upTree(root->depth,root,size-1);
routine.clear();
}//瀹屾垚鎯呭喌浜屽彾瀛愯妭鐐圭殑鍒犻櫎
else{//鎯呭喌涓夛細鏈夊厔寮?br> //鍙渶瑕佸皢鑺傜偣鍒犻櫎錛屽茍娓呯悊璺緞琛ㄥ氨鍙互浜?br> if (pos == parent->ln) parent->ln = NULL;
else parent->rn = NULL;
delete pos;
routine.clear();
}//瀹屾垚鎯呭喌涓夌殑鍙跺瓙鑺傜偣鍒犻櫎
}
}
return true;
}
template<typename E>
bool AVL_TMP<E>::del(dataType e){
return delAux(e);
}
}
void main()
{
outTofile();
}