#include <iostream>
using namespace std;
// Declarations
template <typename T>
class List;
template <typename T>
class Stack;
template <typename T>
class Queue;
template <typename T>
ostream& operator<<(ostream&, const List<T>&);
template <typename T>
ostream& operator<<(ostream&, const Stack<T>&);
template <typename T>
ostream& operator<<(ostream&, const Queue<T>&);
template <typename T>
class Node{
private:
friend class List<T>;
friend class Stack<T>;
friend class Queue<T>;
};
template <typename T>
class List{
public:
friend ostream& operator<< <T>(ostream&, const List<T>&);
};
template <typename T>
class Stack{
public:
friend ostream& operator<< <T>(ostream&, const Stack<T>&);
};
template <typename T>
class Queue{
public:
friend ostream& operator<< <T>(ostream&, const Queue<T>&);
};
// Definitions
template <typename T>
ostream& operator<<(ostream& out, const List<T>& toPrint) {
out << "List";
return cout;
}
template <typename T>
ostream& operator<<(ostream& out, const Stack<T>& toPrint) {
out << "Stack";
return out;
}
template <typename T>
ostream& operator<<(ostream& out, const Queue<T>& toPrint) {
out << "Queue";
return out;
}
// main
int main() {
List<int> list;
Stack<int> stack;
Queue<int> queue;
cout << list << endl
<< stack << endl
<< queue << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gRGVjbGFyYXRpb25zCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgTGlzdDsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIFN0YWNrOwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgUXVldWU7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgTGlzdDxUPiYpOwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiwgY29uc3QgU3RhY2s8VD4mKTsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cm9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYsIGNvbnN0IFF1ZXVlPFQ+Jik7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgTm9kZXsKICAgIHByaXZhdGU6CiAgICAgICAgZnJpZW5kIGNsYXNzIExpc3Q8VD47CiAgICAgICAgZnJpZW5kIGNsYXNzIFN0YWNrPFQ+OwogICAgICAgIGZyaWVuZCBjbGFzcyBRdWV1ZTxUPjsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBMaXN0ewogICAgcHVibGljOgogICAgICAgIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihvc3RyZWFtJiwgY29uc3QgTGlzdDxUPiYpOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIFN0YWNrewogICAgcHVibGljOgogICAgICAgIGZyaWVuZCBvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihvc3RyZWFtJiwgY29uc3QgU3RhY2s8VD4mKTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBRdWV1ZXsKICAgIHB1YmxpYzoKICAgICAgICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4ob3N0cmVhbSYsIGNvbnN0IFF1ZXVlPFQ+Jik7Cn07CgovLyBEZWZpbml0aW9ucwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cm9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LCBjb25zdCBMaXN0PFQ+JiB0b1ByaW50KSB7CiAgICBvdXQgPDwgIkxpc3QiOwogICAgcmV0dXJuIGNvdXQ7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG91dCwgY29uc3QgU3RhY2s8VD4mIHRvUHJpbnQpIHsKICAgIG91dCA8PCAiU3RhY2siOwogICAgcmV0dXJuIG91dDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cm9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LCBjb25zdCBRdWV1ZTxUPiYgdG9QcmludCkgewogICAgb3V0IDw8ICJRdWV1ZSI7CiAgICByZXR1cm4gb3V0Owp9CgovLyBtYWluCgppbnQgbWFpbigpIHsKCUxpc3Q8aW50PiAgbGlzdDsKCVN0YWNrPGludD4gc3RhY2s7CglRdWV1ZTxpbnQ+IHF1ZXVlOwoJCgljb3V0IDw8IGxpc3QgIDw8IGVuZGwKCSAgICAgPDwgc3RhY2sgPDwgZW5kbAoJICAgICA8PCBxdWV1ZSA8PCBlbmRsOwoJCglyZXR1cm4gMDsKfQ==