mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
1.6 KiB
110 lines
1.6 KiB
//
|
|
// Stack.h
|
|
//
|
|
// define a stack template class
|
|
//
|
|
#if !defined(_stack_h)
|
|
#define _stack_h 1
|
|
|
|
template <class El, unsigned size>
|
|
class Stack {
|
|
enum { cElementGrow = 64 };
|
|
|
|
unsigned _cEl;
|
|
unsigned _cElSpill;
|
|
El * _rgElSpill;
|
|
El _rgEl[ size ];
|
|
|
|
int
|
|
FEnsureSpill ( unsigned cEl ) {
|
|
if ( cEl >= size && cEl - size >= _cElSpill ) {
|
|
El * pEl = new El[ _cElSpill + cElementGrow ];
|
|
if ( pEl ) {
|
|
if ( _cElSpill ) {
|
|
for ( unsigned iel = 0; iel < cEl - size; iel++ ) {
|
|
pEl[ iel ] = _rgElSpill [ iel ];
|
|
}
|
|
delete [] _rgElSpill;
|
|
}
|
|
_rgElSpill = pEl;
|
|
_cElSpill += cElementGrow;
|
|
return fTrue;
|
|
}
|
|
}
|
|
else {
|
|
return fTrue;
|
|
}
|
|
return fFalse;
|
|
}
|
|
|
|
public:
|
|
Stack() {
|
|
_cEl = _cElSpill = 0;
|
|
_rgElSpill = 0;
|
|
}
|
|
~Stack() {
|
|
if ( _rgElSpill ) {
|
|
delete [] _rgElSpill;
|
|
_rgElSpill = 0;
|
|
_cElSpill = 0;
|
|
}
|
|
}
|
|
|
|
unsigned
|
|
Count() const {
|
|
return _cEl;
|
|
}
|
|
|
|
int
|
|
FPush ( El el ) {
|
|
if ( _cEl >= size ) {
|
|
if ( FEnsureSpill ( _cEl + 1 ) ) {
|
|
_rgElSpill [ _cEl - size ] = el;
|
|
}
|
|
else {
|
|
return fFalse;
|
|
}
|
|
}
|
|
else {
|
|
_rgEl[ _cEl ] = el;
|
|
}
|
|
_cEl++;
|
|
return fTrue;
|
|
}
|
|
|
|
El
|
|
Pop() {
|
|
if ( _cEl ) {
|
|
if ( _cEl > size ) {
|
|
return _rgElSpill[ (--_cEl) - size ];
|
|
}
|
|
else {
|
|
return _rgEl[ --_cEl ];
|
|
}
|
|
}
|
|
else {
|
|
assert ( fFalse );
|
|
return El(0);
|
|
}
|
|
}
|
|
|
|
El
|
|
Top() const {
|
|
if ( _cEl ) {
|
|
if ( _cEl > size ) {
|
|
return _rgElSpill[ _cEl - 1 - size ];
|
|
}
|
|
else {
|
|
return _rgEl[ _cEl - 1 ];
|
|
}
|
|
}
|
|
else {
|
|
assert ( fFalse );
|
|
return El(0);
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
|
|
#endif // _stack_h
|