// generic queue implemented with doubly linked list 
#include<iostream>
#include<string>
#include <list>
using std::cout;
using std::endl;
using std::string;
template<class T>
class Queue {
public:
    Queue() { 
    }
    void clear() {
        lst.clear();
    }
    bool isEmpty() const { 
        return lst.empty();  
    }
    T& front() { 
        return lst.front();  
    }
    void enqueue(const T& el) {
        lst.push_back(el);
    }
    T dequeue() {
        T el = lst.front();
        lst.pop_front();
        return el;
    }
private:
    std::list<T> lst;
};
int main(){
    Queue<string> tque;
    tque.enqueue("you ");
    tque.enqueue("are ");
    tque.enqueue("a ");
    tque.enqueue("shining ");
    tque.enqueue("star.");
    while(!tque.isEmpty()){
        cout << tque.dequeue();
    }
    cout << endl;
    // A segmentation fault will happen.
    //cout << tque.dequeue();
}