вторник, 4 июня 2013 г.

Стек (упрощенная реализация)

в  файле MyStack.h :


#include <iostream>
using namespace std;

template<typename T>
class MyStack
{
public:
MyStack();
MyStack(int size);
MyStack(const MyStack<T> &over);
~MyStack();
MyStack<T>& operator=(const MyStack<T> &over);

T pop();
void push(T item);
bool empty() const;
private:
int m_top;
int m_size;
T *m_stack;
};

template<typename T>
MyStack<T>::MyStack()
: m_top(-1)
, m_size(10) // по умолчанию стек на 10 элементов
{
m_stack = new T[m_size];
}

template<typename T>
MyStack<T>::MyStack(int size)
: m_top(-1)
, m_size(size)
{
m_stack = new T[m_size];
}

template<typename T>
MyStack<T>::~MyStack()
{
delete[] m_stack;
}

template<typename T>
MyStack<T>::MyStack(const MyStack<T> &over)
{
m_top = over.m_top;
m_size = over.m_size;
m_stack = new T[m_size];

for (int i = 0; i <= m_top; ++i)
{
m_stack[i] = over.m_stack[i];
}
}

template<typename T>
MyStack<T>& MyStack<T>::operator=(const MyStack<T> &over)
{
if (this != &over)
{
m_top = over.m_top;
m_size = over.m_size;

delete[] m_stack;
m_stack = new T[m_size];

for (int i = 0; i <= m_top; ++i)
{
m_stack[i] = over.m_stack[i];
}
}
return *this;
}

template<typename T>
T MyStack<T>::pop()
{
if (-1 != m_top)
{
return m_stack[m_top--];
}
else
{
cout << "Stack is empty ";
cout << endl;
}
}

template<typename T>
void MyStack<T>::push(T item)
{
if ( m_top != m_size - 1)
{
m_stack[++m_top] = item;
}
else
{
cout << "Stack is fill ";
cout << endl;
}
}

template<typename T>
bool MyStack<T>::empty() const
{
return (-1 == m_top);
}

main.cpp:


#include "MyStack.h"

int main()
{
MyStack<int> obj1(2);
MyStack<int> obj2;
obj1.push(20);
obj1.push(10);

obj2 = obj1;
cout << obj2.pop() << endl;
cout << obj2.pop() << endl;
return 0;
}