An implementation of Stack data structure

#include <iostream>
#include <new>
#include <string>
#include <sstream>
using namespace std;

#if !defined __STACK_H
#define __STACK_H

namespace stk{
	class Stack{
		private:
			int *p;
			int top,length;

			string str()const;
		public:
			Stack();
			Stack(const int);
			Stack(const Stack&);
			~Stack();

			void push(int);
			int pop();
			int get_length()const;
			bool is_empty()const;
			Stack operator=(const Stack&);
			friend ostream& operator<<(ostream&,Stack&);

			class StackException{
				private:
					string desc;
				public:
					StackException(string exp){ desc="Exception : "+exp; }
					string get_exp(){ return desc; }
			};
	};

	Stack::Stack(){
		top=-1;
		length=0;
		p=0;
	}

	Stack::Stack(const int size){
		top=-1;
		length=size;
		try{
			p=new int[length];
		}catch(bad_alloc ba){
			cout<<"Memory can not be alllocated
";
			return;
		}
	}

	Stack::Stack(const Stack &o){
		top=o.top;
		length=o.length;
		try{
			p=new int[length];
		}catch(bad_alloc ba){
			cout<<"Memory allocation failed
";
			return;
		}
		for(int i=0;i<length;i++)
			p[i]=o.p[i];
	}

	Stack::~Stack(){
		if(p!=0)
			delete [] p;
	}

	void Stack::push(int elem){
		if(p==0){
			try{
				p=new int[1];
			}catch(bad_alloc ba){
				throw StackException("Memory fault
");
			}
			length++;
			top++;
			p[top]=elem;
		}
		else if(top==(length-1)){
			int *q;
			try{
				q=new int[length+1];
			}catch(bad_alloc ba1){
				throw StackException("Memory fault
");
			}
			for(int i=0;i<length;i++)
				q[i]=p[i];
			length++;
			top++;
			q[top]=elem;
			delete [] p;
			p=q;
		}
		else{
			top++;
			p[top]=elem;
		}
	}

	int Stack::pop(){
		if(p==0 || top==-1){
			throw StackException("Stack empty!
");
		}
		int ret=p[top];
		top--;
		length--;

		if(top==-1){
			delete [] p;
			p=0;
		}
		else{
			int *q;
			try{
				q=new int[length];
			}catch(bad_alloc ba){
				throw StackException("Memory fault
");
			}
			for(int i=0;i<length;i++)
				q[i]=p[i];
			delete [] p;
			p=q;
		}

		return ret;
	}

	int Stack::get_length()const{
		return length;
	}

	bool Stack::is_empty()const{
		return ((p==0)? true : false);
	}

	string Stack::str()const{  // private member function
		stringstream ss;
		for(int i=0;i<length;i++){
			ss << p[i];
			if(i!=(length-1))
				ss << ", ";
		}
		//ss<<"
";
		return ss.str();
	}

	Stack Stack::operator=(const Stack &stk){
		length=stk.length;
		top=stk.top;

		if(p!=0)
			delete [] p;
		try{
			p=new int[length];
		}catch(bad_alloc ba){
			throw StackException("Memory fault in copying!
");
		}
		for(int i=0;i<length;i++)
			p[i]=stk.p[i];

		return *this;
	}

	ostream& operator<<(ostream &o,Stack &s){
		o<<s.str();
		return o;
	}

} // namespace stk;

#endif


