typedef struct {
    int data[100001];
    int front;
    int rear;
} MyStack;

/** Initialize your data structure here. */

MyStack* myStackCreate() {
    MyStack * node= (MyStack *) malloc(sizeof(MyStack));
        node->rear=-1;
    node->front=0;
        return node;
}

/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) {
 
  obj->rear+=1;
  obj->data[obj->rear]=x;
//printf("push New front = %d , rear = %d\n",obj->front,obj->rear);
}

/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) {
    int val;
    if(obj->rear>0)
    {
  MyStack *s2=myStackCreate();
  while(obj->front<obj->rear)
  {
      myStackPush(s2,obj->data[obj->front]);
      obj->front+=1;
  }
    val=obj->data[obj->rear];
        obj=s2;
    //printf("pop New front = %d , rear = %d\n",obj->front,obj->rear);    
    }
    else
    {
        val=obj->data[obj->rear];
        obj->rear=-1;
    }
    return val;
}

/** Get the top element. */
int myStackTop(MyStack* obj) {
//  printf(" New front = %d , rear = %d\n",obj->front,obj->rear); 
  int val= obj->data[obj->rear];
    return val;
}

/** Returns whether the stack is empty. */
bool myStackEmpty(MyStack* obj) {
  if (obj->front>obj->rear)
      return true;
    else 
        return false;
}

void myStackFree(MyStack* obj) {
    obj=NULL;
}

/**
 * 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);
*/