Pushok icon

Updated stack and exemple of using it

Pushok | PRO | 04/10/11 04:21:34 PM UTC | 0 ⭐ | 484 👁️ | Never ⏰ | []
C++ |

1.57 KB

|

None

|

0 👍

/

0 👎

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
template<typename T> class CStack {
public:
    static enum {CStack_StackEmpty, CStack_BadMemory};
 
    unsigned int size()
    {
        return StackSize;
    }
 
    bool empty()
    {
        return StackSize == 0;
    }
 
    T pop()
    {
        T top = 0;
 
        if(StackSize != 0)
        {
            top = _Stack[StackSize-1];
 
            T* _newstack = (T*)malloc(--StackSize * sizeof(T));
 
            if(_newstack == NULL)
            {
                throw (int)CStack_BadMemory;
            }
 
            for(int i=0;i<StackSize;i++)
            {
                _newstack[i] = _Stack[i];
            }
 
            free(_Stack);
            _Stack = _newstack;
 
            return top;
 
        } else 
        {
            throw (int)CStack_StackEmpty;
        }
    }
 
    void push(T j)
    {
        T* _newstack = (T*)malloc(++StackSize * sizeof(T));
 
        if(_newstack == NULL)
        {
            throw (int)CStack_BadMemory;
        }
 
        if(_Stack != NULL)
        {
            for(int i=0;i<StackSize-1;i++)
            {
                _newstack[i] = _Stack[i];
            }
 
            free(_Stack);
        }
 
        _Stack = _newstack;
 
        _Stack[StackSize-1] = j;
    }
 
    void clear()
    {
        free(_Stack);
        _Stack = NULL;
        StackSize = 0;
    }
 
    CStack()
    {
        StackSize = 0;
        _Stack = NULL;
    }
 
    ~CStack()
    {
        free(_Stack);
        StackSize = 0;
    }
 
private:
    unsigned int StackSize;
    T* _Stack;
};
 
int main(void)
{
    CStack<int> s;
 
    for(int i=0;i<=10;i++)
    {
        s.push(i*i);
    }
 
    try
    {
        for(int i=0;i<=100;i++)
        {
            printf("%d\n",s.pop());
        }
    }
    catch(int ex)
    {
        printf(ex == static_cast<int>(CStack<int>::CStack_StackEmpty) ? "Stack is empty" : "Can not alloc memory");
    }
 
    getchar();
    return 0;
}

Comments