Initial commit
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user