template <class Type> class DblStack { //雙棧的類定義
private:
int top[2], bot[2]; //雙棧的棧頂指針和棧底指針
Type *elements; //棧數組
int m; //棧最大可容納元素個數
public:
DblStack ( int sz =10 ); //初始化雙棧, 總體積m的默認值為10
~DblStack ( ) { delete [ ] elements; } //析構函數
void DblPush ( const Type& x, int i ); //把x插入到棧i的棧頂
int DblPop ( int i ); //退掉位於棧i棧頂的元素
Type * DblGetTop ( int i ); //返回棧i棧頂元素的值
int IsEmpty ( int i ) const { return top[i] == bot[i]; } //判棧i空否, 空則返回1, 否則返回0
int IsFull ( ) const { return top[0]+1 == top[1]; } //判棧滿否, 滿則返回1, 否則返回0
void MakeEmpty ( int i ); //清空棧i的內容
}
template <class Type> DblStack<Type> :: DblStack ( int sz ) : m(sz), top[0] (-1), bot[0](-1), top[1](sz), bot[1](sz) {
//建立壹個最大尺寸為sz的空棧, 若分配不成功則錯誤處理。
elements = new Type[m]; //創建棧的數組空間
assert ( elements != NULL ); //斷言: 動態存儲分配成功與否
}
template <class Type> void DblStack<Type> :: DblPush ( const Type& x, int i ) {
//如果IsFull ( ),則報錯;否則把x插入到棧i的棧頂
assert ( !IsFull ( ) ); //斷言: 棧滿則出錯處理,停止執行
if ( i == 0 ) elements[ ++top[0] ] = x; //棧0情形:棧頂指針先加1, 然後按此地址進棧
else elements[--top[1] ] = x; //棧1情形:棧頂指針先減1, 然後按此地址進棧
}
template <class Type> int DblStack<Type> :: DblPop ( int i ) {
//如果IsEmpty ( i ),則不執行退棧,返回0;否則退掉位於棧i棧頂的元素,返回1
if ( IsEmpty ( i ) ) return 0; //判棧空否, 若棧空則函數返回0
if ( i == 0 ) top[0]--; //棧0情形:棧頂指針減1
else top[1]++; //棧1情形:棧頂指針加1
return 1;
}
template <class Type> Type * DblStack<Type> :: DblGetTop ( int i ) {
//若棧不空則函數返回該棧棧頂元素的地址。
if ( IsEmpty ( int i ) ) return NULL; //判棧i空否, 若棧空則函數返回空指針
return& elements[ top[i] ]; //返回棧頂元素的值
}
template <class Type> void MakeEmpty ( int i ) {
if ( i == 0 ) top[0] = bot[0] = -1;
else top[1] = bot[1] = m;
}
我照著資料壹個壹個打出來的。