1、前言
棧是lifo序列(後進先出),ace既支援動態棧,也支援靜態棧,靜態棧的尺寸固定,使用代價較低。ace提供了兩種靜態棧:有界棧ace_bounded_stack和固定棧ace_fixed_stack。動態棧在每次插入時候分配記憶體,每次彈出時候釋放該記憶體,即無界棧ace_unbounded_stack型別。
有界棧和固定棧的區別在於:有界棧是在執行時固定下來的,方法是把尺寸作為引數傳遞給棧的構造器:
ace_bounded_stackbstack(100);
固定棧的尺寸是在編譯時確定的,在內部,固定棧使用的是乙個陣列。
ace_fixed_stackbstack1;
而無界棧ace_unbounded_stack內部實際上使用的是乙個鍊錶表示,因此有意思的是,除了常規彈出操作外,也可以用迭代器遍歷無界棧。
2、測試全部源**,含有全部注釋
#define ace_ntrace 0
#include "ace/containers_t.h"
class dataelement;
class stacktests
}//第二個有界棧棧宣告:值容器
ace_bounded_stackbstack2(100);
//棧複製:深度複製--元素全部複製過來
bstack2=bstack1;
while(!bstack2.is_empty())
ace_debug((lm_debug,ace_text("/n")));
return 0;
}//固定棧測試
//固定棧也是一種靜態棧
//固定棧與有界棧的區別是:它是在宣告時,用模板引數設定棧大小,而有界棧則在宣告時需要進行初始堆分配
int runfixedstack(void)
for(int j=0;j<100;j++)
ace_debug((lm_debug,ace_text("/n")));
//離開作用域,棧將被銷毀(元素在出棧後已經銷毀:delete element;)
return 0;
}//無界棧實際上內部使用的是一種鍊錶表示
//因此我們可以用迭代器來遍歷棧中的每乙個元素
//當然按照使用棧的慣例,我們一般不使用迭代器來遍歷這些元素,而是用彈出的方式來使用
int rununboundedstack(void)
//棧使用的常規方法:彈出
while(!ustack.is_empty())
ace_debug((lm_debug,ace_text("/n")));
//使用迭代器來遍歷棧中的元素
//ace_unbounded_stack_iteratoriter(ustack);
//for(iter.first();!iter.done();iter.advance())
// }};
ACE篇之十一 ACE容器之六(自調整的二叉樹)
1 ace提供的樹實現為紅黑樹,名為ace rb tree,介面與對映表類似,其實現實際上是乙個值容器。型別定義是 ace rb tree 2 測試類 tree practice.h include ace rb tree.h include dataelement.h 紅黑樹型別封裝成助手模板類l...
ACE篇之九 ACE容器之四(集合)
1 前言 集合是不允許其所含條目重複的序列。ace有兩種集合 有界集合和無界集合,即ace bounded set和ace unbounded set。它們支援插入 查詢 迭代。2 測試完整源 如下 原書本有多處錯誤 include ace containers.h include dataelem...
ACE篇之九 ACE容器之五(集合)
1 前言 集合是不允許其所含條目重複的序列。ace有兩種集合 有界集合和無界集合,即ace bounded set和ace unbounded set。它們支援插入 查詢 迭代。2 測試完整源 如下 原書本有多處錯誤 include ace containers.h include dataelem...