demo_stack : ตัวอย่าง Stack

โจทย์สำหรับ
การสร้าง Stack
#include <iostream>

using namespace std;

template <class T>
class Stack {
public:
    virtual void push(T item) = 0;      // เพิ่มสมาชิกลงไปบน Stack
    virtual T  pop() = 0;               // เอาสมาชิกออกจาก Stack
    virtual T  top() = 0;                       // ดูข้อมูลสมาชิกตัวบนสุด
    virtual bool empty() = 0;           // ตรวจสอบว่า Stack ว่างหรือไม่
};

template <class T>
class ArrayStack : public Stack<T> {
    T *data;
    int n;
    int last;
public:
    ArrayStack(int size) {
        data = new T[size];
        n=size;
        last=0;
    }
    ~ArrayStack() {
        delete [ ] data;
    }
    void push(T item) ;
    T  pop();
    T  top();
    bool empty() {
        return last == 0;
    }
};

template <class T>
class LNode {
public:
    T data;
    LNode<T> *link;
    LNode(T value) {
        data = value;
        link=NULL;
    }
};

template <class T>
class LinkedStack : public Stack<T> {
    LNode<T> *first;
public:
    LinkedStack() {
        first = NULL;
    }
    ~LinkedStack() {
        while(!empty()) {
            pop();
        }
    }
    bool empty() {
        return first == NULL;
    }
    void push(T item) ;
    T  pop();
    T  top();
};


int main()
{

    LinkedStack<int>        stack;  // stack of ints

    intStack.push(7);
    cout << intStack.top() <<endl;
    cout << intStack.pop() <<endl;
    cout << intStack.pop() <<endl;


    Stack<string> *s1, *s2;

    s1 = new ArrayStack<string>(10);
    s2 = new LinkedStack<string>;

    s1->push("Apple");
    s2->push("Apple");
    s1->push("Banana");
    s2->push("Banana");
    cout << "s1.pop()=" << s1->pop() << endl;
    cout << "s1.pop()=" << s1->pop() << endl;
    cout << "s2.pop()=" << s2->pop() << endl;
    cout << "s2.pop()=" << s2->pop() << endl;

    delete s1;
    delete s2;
    return 0;
}

template <class T>
void LinkedStack<T>::push(T item) {
    LNode<T>  *p = new LNode<T>(item);
    p->link = first;
    first = p;
}

template <class T>
T  LinkedStack<T>::pop() {
    if(empty()) {
        cout << "Stack is empty.\n";
        return T();
    }
    T result = first->data;
    LNode<T>  *p = first;
    first = first->link;
    delete p;
    return result;
}

template <class T>
T  LinkedStack<T>::top() {
    if(empty()) {
        cout << "Stack is empty.\n";
        return T();
    }
    T result = first->data;
    return result;
}



template <class T>
void ArrayStack<T>::push(T item) {
    if(last>=n) {
        cout << "Stack overflow.\n";
        return;
    }

    data[last]=item;
    last++;
}

template <class T>
T ArrayStack<T>::pop( ) {
    if(empty()) {
        cout << "Stack is empty.\n";
        return T();
    }
    last--;
    return data[last];
}
template <class T>
T ArrayStack<T>::top( ) {
    if(empty()) {
        cout << "Stack is empty.\n";
        return T();
    }
    return data[last-1];
}