using namespace std;
const int MAX_SIZE = 100;
template<class DataType>
class Stack {
private:
DataType *data;
int size;
int top;
public:
Stack();
Stack(int len);
~Stack();
void push(DataType ch);
DataType pop();
DataType getTop();
bool isEmpty();
bool isFull();
void setNull();
class Full{};
class Empty{};
};
template<class DataType>
Stack<DataType>::Stack() {
data = new DataType[MAX_SIZE];
size = MAX_SIZE;
top = -1;
}
template<class DataType>
Stack<DataType>::Stack(int len) {
data = new DataType[len];
size = len;
top = -1;
}
template<class DataType>
Stack<DataType>::~Stack() {
delete [] data;
}
template<class DataType>
void Stack<DataType>::push(DataType ch) {
if (isFull()) {
throw Stack<DataType>::Full();
} else {
data[++top] = ch;
}
}
template<class DataType>
DataType Stack<DataType>::pop() {
if (isEmpty()) {
throw Stack<DataType>::Empty();
} else {
return data[top--];
}
}
template<class DataType>
DataType Stack<DataType>::getTop() {
if (isEmpty()) {
throw Stack<DataType>::Empty();
} else {
return data[top];
}
}
template<class DataType>
bool Stack<DataType>::isEmpty() {
return top == -1;
}
template<class DataType>
bool Stack<DataType>::isFull() {
return top == size -1;
}
template<class DataType>
void Stack<DataType>::setNull() {
top = -1;
}
int main()
{
Stack<char> s(2);
try {
s.push('a');
s.push('b');
s.push('c');
} catch (Stack<char>::Full) {
cout << "Stack<char> Full !!" << endl;
}
Stack<double> s2(2);
try {
s2.push(99.99);
s2.push(88.88);
s2.push(77.77);
} catch (Stack<double>::Full) {
cout << "Stack<double> Full !!" << endl;
}
return 0;
}