Template Usage Scenario 3

#include <iostream>
using std::endl;
using std::cout;

#include <string>
using std::string;

template<typename T>

class Stack
{
public:
    Stack(int=10);
    ~Stack()
    {
        delete [] stackPtr;
    }
    bool push(const T&);
    bool pop(T&);
    bool isEmpty() const
    {
        return top==-1;
    }
    bool isFull() const
    {
        return top==size-1;
    }
private:
    int size;
    int top;
    T *stackPtr;

};

template<typename T>
Stack<T>::Stack(int s):size(s>0?s:10), top(-1),stackPtr(new T[size])
{
    
}

template<typename T>
bool Stack<T>::push(const T &pushValue)
{
    if(!isFull())
    {
        stackPtr[++top]=pushValue;
        return true;
        
    }
    return false;
}

template <typename T>
bool Stack<T>::pop(T &popValue)
{
    if(! isEmpty())
    {
        popValue=stackPtr[top--];
        return true;         
        
    }
    return false;
}

template<typename T>
void testStack(Stack<T> &theStack, T value, T increment, const string stackName)
{
    cout<<"/nPushing element onto"<<stackName<<endl;
    while(theStack.push(value))
    {
        cout<<value<<" ";
        value+=increment;
    }
    cout<<"/nStack is full. Can't push "<<value<<endl;
    cout<<"Pop elements from"<<stackName<<endl;
    while(theStack.pop(value))
        cout<<value<<" ";
    cout<<"/nStack is empty. Can't pop"<<endl;
}

int TemplateUsage3()
{
    Stack<double> doubleStack(5);        
    Stack<int> intStack(5);
    
    testStack(doubleStack, 1.1, 1.1, "doubleStack");
    testStack(intStack, 1, 1, "intStack");
    
    return 0;
}

int main()
{
    TemplateUsage3();
    return 0;
}

你可能感兴趣的:(Template Usage Scenario 3)