Pushok icon

Little update of stack class.

Pushok | PRO | 04/11/11 11:31:20 AM UTC | 0 ⭐ | 435 👁️ | Never ⏰ | []
C++ |

1.24 KB

|

None

|

0 👍

/

0 👎

template<typename T> class CStack {
public:
    static enum {CStack_StackEmpty, CStack_BadMemory};
 
    unsigned int size()
    {
        return StackSize;
    }
 
    bool empty()
    {
        return StackSize == 0;
    }
 
    T pop()
    {
        if(StackIter == 0) throw (int)CStack_StackEmpty;
 
        return _Stack[--StackIter];
    }
 
    void push(T j)
    {
        if(StackSize >= StackIter && _Stack != 0)
        {
            T* _newstack = (T*)malloc(sizeof(T) * (StackSize + 1));
 
            if(_newstack == NULL)
            {
                free(_newstack);
                this->~CStack();
                throw (int)CStack_BadMemory;
            }
 
            for(int i=0;i<StackSize;i++)
                _newstack[i] = _Stack[i];
            
            free(_Stack);
 
            _Stack = _newstack;
        } 
        else if (_Stack == 0)
        {
            _Stack = (T*)malloc(sizeof(T) * (StackSize == 0 ? 1 : StackSize));
            if(_Stack == 0)
            {
                this->~CStack();
                throw (int)CStack_BadMemory;
            }
        }
 
        _Stack[StackSize++] = j;
 
        StackIter = StackSize;
 
    }
 
    void clear()
    {
        StackIter = 0;
    }
 
    void allclear() // useless
    {
        free(_Stack);
        StackIter = StackSize = 0;
    }
 
    CStack()
    {
        StackIter = StackSize = 0;
        _Stack = NULL;
    }
 
    ~CStack()
    {
        free(_Stack);
        StackIter = StackSize = 0;
    }
 
private:
    unsigned int StackSize, StackIter;
    T* _Stack;
};

Comments