#include <vector>
#include <stdexcept>
template<class T>
class Stack
{
private:
std::vector<T> elems;
public:
void push(T const&);
void pop();
T top() const;
bool empty() const
{
return elems.empty();
}
Stack();
~Stack()
{
std::cout << "destructor called." << std::endl;
}
};
template<class T>
void Stack<T>::push(T const& elem)
{
std::cout << "push is called: " << std::endl;
elems.push_back(elem);
}
template<class T>
void Stack<T>::pop()
{
if (elems.empty())
{
throw std::out_of_range("Stack<>::pop(): empty stack");
}
elems.pop_back();
}
template<class T>
T Stack<T>::top() const
{
if (elems.empty())
{
std::cout << "empty stack" << std::endl;
throw std::out_of_range("Stack<>::top(): empty stack");
}
return elems.back();
}
template<class T>
Stack<T>::Stack()
{
std::cout << "Default constructor called.." << std::endl;
}
////// stack1test.cpp ////////
#include <iostream>
#include <string>
#include <cstdlib>
#include "stack1.h"
int main()
{
try
{
std::cout << "Starting the process: " << std::endl;
Stack<int> intStack;
// Stack<std::string> stringStack;
std::cout << "Is empty: " << intStack.empty() << std::endl;
intStack.push(7);
int x = intStack.top();
std::cout << x << std::endl;
}
catch(std::exception const& ex)
{
std::cout << "Exception: " << ex.what() << std::endl;
return EXIT_FAILURE;
}
}
//// end of program ///////////