typedef struct {
int data[10000];
int head;
int tail;
} queue;
void queueIN(queue * q, int number)
{
q->data[q->head] = number;
q->head += 1;
}
int queueOUT(queue * q)
{
q->tail += 1;
int out = q->data[q->tail];
return out;
}
typedef struct {
queue q1;
queue q2;
} MyStack;
/** Initialize your data structure here. */
MyStack* myStackCreate() {
MyStack * st = (MyStack *)malloc(sizeof(MyStack));
st->q1.head = 0;
st->q1.tail = 0;
st->q2.head = 0;
st->q2.tail = 0;
return st;
}
/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) {
int tmp;
for(;obj->q1.head > obj->q1.tail;)
{
tmp = queueOUT(&obj->q1);
queueIN(&obj->q2, tmp);
}
queueIN(&obj->q1, x);
for(;obj->q2.head > obj->q2.tail;)
{
tmp = queueOUT(&obj->q2);
queueIN(&obj->q1, tmp);
}
}
/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) {
int out = queueOUT(&obj->q1);
return out;
}
/** Get the top element. */
int myStackTop(MyStack* obj) {
int tmp;
int top = queueOUT(&obj->q1);
queueIN(&obj->q2, top);
for(;obj->q1.head > obj->q1.tail;)
{
tmp = queueOUT(&obj->q1);
queueIN(&obj->q2, tmp);
}
for(;obj->q2.head > obj->q2.tail;)
{
tmp = queueOUT(&obj->q2);
queueIN(&obj->q1, tmp);
}
return top;
}
/** Returns whether the stack is empty. */
bool myStackEmpty(MyStack* obj) {
return (obj->q1.head == obj->q1.tail);
}
void myStackFree(MyStack* obj) {
}
/**
* Your MyStack struct will be instantiated and called as such:
* MyStack* obj = myStackCreate();
* myStackPush(obj, x);
* int param_2 = myStackPop(obj);
* int param_3 = myStackTop(obj);
* bool param_4 = myStackEmpty(obj);
* myStackFree(obj);
*/