#include <iostream>
#include <string>
using namespace std;
template<typename T>
struct Node
{
Node *Next;
Node *Prev;
T val;
};
template<typename T>
class queue
{
Node<T> *Last;
Node<T> *First;
int size;
public:
queue();
~queue();
void push(T);
void pop();
void show_qF(std::ostream& stream);
void show_qL(std::ostream& stream);
bool empty();
int show_size();
};
template<typename T>
queue<T>::queue()
{
Last = First = NULL;
size = 0;
}
template<typename T>
queue<T>::~queue()
{
Node<T> *tmp;
while(Last != NULL)
{
tmp = Last -> Prev;
delete Last;
Last = tmp;
}
}
template<typename T>
void queue<T>::push(T n)
{
Node<T> *p = new Node<T>;
p -> val = n;
p -> Next = First;
p -> Prev = NULL;
size++;
if(First == NULL)
{
First = Last = p;
Last -> Next = NULL;
First -> Prev = NULL;
return;
}
First -> Prev = p;
First = p;
}
template<typename T>
void queue<T>::pop()
{
if(Last == NULL) return;
Node<T> *tmp;
tmp = Last;
if(Last -> Prev != NULL)
{
Last = Last -> Prev;
}
else
{
Last = First = NULL;
}
delete tmp;
size--;
}
template<typename T>
int queue<T>::show_size()
{
return size;
}
template<typename T>
void queue<T>::show_qF(std::ostream& stream)
{
Node<T> *p;
p = First;
while(p != NULL)
{
stream<< p -> val <<std::endl;
p = p -> Next;
}
}
template<typename T>
void queue<T>::show_qL(std::ostream& stream)
{
Node<T> *p;
p = Last;
while(p != NULL)
{
stream<< p -> val <<std::endl;
p = p -> Prev;
}
}
template<typename T>
bool queue<T>::empty()
{
return First == NULL;
}
int main()
{
queue<std::string> q;
q.push("1");
q.push("2");
q.push("3");
q.pop();
q.show_qF(std::cout);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBOb2RlCnsKICAgICAgICBOb2RlICpOZXh0OwogICAgICAgIE5vZGUgKlByZXY7CiAgICAgICAgVCB2YWw7Cn07CiAKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgcXVldWUKewogICAgICAgIE5vZGU8VD4gKkxhc3Q7CiAgICAgICAgTm9kZTxUPiAqRmlyc3Q7CiAgICAgICAgaW50IHNpemU7CiAKcHVibGljOgogICAgICAgIHF1ZXVlKCk7CiAgICAgICAgfnF1ZXVlKCk7CiAgICAgICAgdm9pZCBwdXNoKFQpOwogICAgICAgIHZvaWQgcG9wKCk7CiAgICAgICAgdm9pZCBzaG93X3FGKHN0ZDo6b3N0cmVhbSYgc3RyZWFtKTsKICAgICAgICB2b2lkIHNob3dfcUwoc3RkOjpvc3RyZWFtJiBzdHJlYW0pOwogICAgICAgIGJvb2wgZW1wdHkoKTsKICAgICAgICBpbnQgc2hvd19zaXplKCk7Cn07CiAKdGVtcGxhdGU8dHlwZW5hbWUgVD4KcXVldWU8VD46OnF1ZXVlKCkKewogICAgICAgIExhc3QgPSBGaXJzdCA9IE5VTEw7CiAgICAgICAgc2l6ZSA9IDA7Cn0KIAp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpxdWV1ZTxUPjo6fnF1ZXVlKCkKewogICAgICAgIE5vZGU8VD4gKnRtcDsKICAgICAgICB3aGlsZShMYXN0ICE9IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICB0bXAgPSBMYXN0IC0+IFByZXY7CiAgICAgICAgICAgIGRlbGV0ZSBMYXN0OwogICAgICAgICAgICBMYXN0ID0gdG1wOwogICAgICAgIH0KfQogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgcXVldWU8VD46OnB1c2goVCBuKQp7CiAgICAgICAgTm9kZTxUPiAqcCA9IG5ldyBOb2RlPFQ+OwogICAgICAgIHAgLT4gdmFsID0gbjsKICAgICAgICBwIC0+IE5leHQgPSBGaXJzdDsKICAgICAgICBwIC0+IFByZXYgPSBOVUxMOwogICAgICAgIHNpemUrKzsKIAogICAgICAgIGlmKEZpcnN0ID09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBGaXJzdCA9IExhc3QgPSBwOwogICAgICAgICAgICBMYXN0IC0+IE5leHQgPSBOVUxMOwogICAgICAgICAgICBGaXJzdCAtPiBQcmV2ID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KIAogICAgICAgIEZpcnN0IC0+IFByZXYgPSBwOwogICAgICAgIEZpcnN0ID0gcDsKfQogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgcXVldWU8VD46OnBvcCgpCnsKICAgICAgICBpZihMYXN0ID09IE5VTEwpIHJldHVybjsKIAogICAgICAgIE5vZGU8VD4gKnRtcDsKICAgICAgICB0bXAgPSBMYXN0OwogICAgICAgIGlmKExhc3QgLT4gUHJldiAhPSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgTGFzdCA9IExhc3QgLT4gUHJldjsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgTGFzdCA9IEZpcnN0ID0gTlVMTDsKICAgICAgICB9CiAKICAgICAgICBkZWxldGUgdG1wOwogICAgICAgIHNpemUtLTsKfQogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmludCBxdWV1ZTxUPjo6c2hvd19zaXplKCkKewogICAgICAgIHJldHVybiBzaXplOwp9CiAKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBxdWV1ZTxUPjo6c2hvd19xRihzdGQ6Om9zdHJlYW0mIHN0cmVhbSkKewogICAgICAgIE5vZGU8VD4gKnA7CiAgICAgICAgcCA9IEZpcnN0OwogICAgICAgIHdoaWxlKHAgIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cmVhbTw8IHAgLT4gdmFsIDw8c3RkOjplbmRsOwogICAgICAgICAgICBwID0gcCAtPiBOZXh0OwogICAgICAgIH0KfQogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgcXVldWU8VD46OnNob3dfcUwoc3RkOjpvc3RyZWFtJiBzdHJlYW0pCnsKICAgICAgICBOb2RlPFQ+ICpwOwogICAgICAgIHAgPSBMYXN0OwogICAgICAgIHdoaWxlKHAgIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cmVhbTw8IHAgLT4gdmFsIDw8c3RkOjplbmRsOwogICAgICAgICAgICBwID0gcCAtPiBQcmV2OwogICAgICAgIH0KfQogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmJvb2wgcXVldWU8VD46OmVtcHR5KCkKewogICAgICAgIHJldHVybiBGaXJzdCA9PSBOVUxMOwp9CiAKCmludCBtYWluKCkgCnsKICBxdWV1ZTxzdGQ6OnN0cmluZz4gcTsKCiAgcS5wdXNoKCIxIik7CiAgcS5wdXNoKCIyIik7CiAgcS5wdXNoKCIzIik7CiAKICBxLnBvcCgpOwogCiAgcS5zaG93X3FGKHN0ZDo6Y291dCk7CiAgcmV0dXJuIDA7Cn0=