#include <iostream>
#include <queue>
using namespace std;
class queue_stack
{
public:
void push(int n);
void pop();
int peek();
bool empty();
private:
queue<int> q1, q2;
};
void queue_stack::push(int n)
{
q2.push(n);
while (!q1.empty())
{
q2.push(q1.front());
q1.pop();
}
q1.swap(q2);
}
void queue_stack::pop()
{
q1.pop();
}
int queue_stack::peek()
{
return q1.front();
}
bool queue_stack::empty()
{
return q1.empty();
}
void assert(int expected, int actual)
{
if (expected != actual)
{
cout << "Expected " << expected << " got " << actual << endl;
}
}
int main()
{
queue_stack s;
s.push(1);
assert(1, s.peek());
s.push(2);
assert(2, s.peek());
s.push(3);
assert(3, s.peek());
s.pop();
assert(2, s.peek());
for (int i = 3; i <= 50; i++)
{
s.push(i);
assert(i, s.peek());
}
int i;
for (i = 50; !s.empty(); i--)
{
assert(i, s.peek());
s.pop();
}
assert(0, i);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgcXVldWVfc3RhY2sKewpwdWJsaWM6CiAgdm9pZCBwdXNoKGludCBuKTsKICB2b2lkIHBvcCgpOwogIGludCBwZWVrKCk7CiAgYm9vbCBlbXB0eSgpOwpwcml2YXRlOgogIHF1ZXVlPGludD4gcTEsIHEyOwp9OwoKdm9pZCBxdWV1ZV9zdGFjazo6cHVzaChpbnQgbikKewogIHEyLnB1c2gobik7CiAgd2hpbGUgKCFxMS5lbXB0eSgpKQogIHsKICAJcTIucHVzaChxMS5mcm9udCgpKTsKICAJcTEucG9wKCk7CiAgfQogIHExLnN3YXAocTIpOwp9Cgp2b2lkIHF1ZXVlX3N0YWNrOjpwb3AoKQp7CiAgcTEucG9wKCk7Cn0KCmludCBxdWV1ZV9zdGFjazo6cGVlaygpCnsKCXJldHVybiBxMS5mcm9udCgpOwp9Cgpib29sIHF1ZXVlX3N0YWNrOjplbXB0eSgpCnsKCXJldHVybiBxMS5lbXB0eSgpOwp9Cgp2b2lkIGFzc2VydChpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpCnsKCWlmIChleHBlY3RlZCAhPSBhY3R1YWwpCgl7CgkJY291dCA8PCAiRXhwZWN0ZWQgIiA8PCBleHBlY3RlZCA8PCAiIGdvdCAiIDw8IGFjdHVhbCA8PCBlbmRsOwoJfQp9CgppbnQgbWFpbigpCnsKICAgIHF1ZXVlX3N0YWNrIHM7CiAgICBzLnB1c2goMSk7CiAgICBhc3NlcnQoMSwgcy5wZWVrKCkpOwogICAgcy5wdXNoKDIpOwogICAgYXNzZXJ0KDIsIHMucGVlaygpKTsKICAgIHMucHVzaCgzKTsKICAgIGFzc2VydCgzLCBzLnBlZWsoKSk7CiAgICBzLnBvcCgpOwogICAgYXNzZXJ0KDIsIHMucGVlaygpKTsKICAgIGZvciAoaW50IGkgPSAzOyBpIDw9IDUwOyBpKyspCiAgICB7CiAgICAJcy5wdXNoKGkpOwogICAgCWFzc2VydChpLCBzLnBlZWsoKSk7CiAgICB9CiAgICAKICAgIGludCBpOwogICAgZm9yIChpID0gNTA7ICFzLmVtcHR5KCk7IGktLSkKICAgIHsKICAgIAlhc3NlcnQoaSwgcy5wZWVrKCkpOwogICAgCXMucG9wKCk7CiAgICB9CiAgICBhc3NlcnQoMCwgaSk7CglyZXR1cm4gMDsKfQ==