#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int val;
    struct node *next;
} Node;

Node *head = NULL;

Node* createN(int x){
    Node *newnode;
    newnode = (Node *)malloc(sizeof(Node));
    newnode->val = x;
    newnode->next = NULL;
    return newnode;
}

void initL(int n){
    int x, i;
    Node *p;
    scanf("%d", &x);
    head = createN(x);
    p = head;
    for(i = 1; i < n; i++){
        scanf("%d", &x);
        p->next = createN(x);
        p = p->next;
    }
}

void freeL(){
    Node *p;
    while(head != NULL){
        p = head->next;
        free(head);
        head = p;
    }
}

void printN(Node *a){
    if(a == NULL) printf("NULL\n");
    else printf("%d\n", a->val);
}

void printL(){
    Node *p = head;
    while(p != NULL){
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}

Node* getN(int n){
    int i;
    Node *p;
    p = head;
    for(i = 1; i < n; i++) p = p->next;
    return p;
}

int countL(){
    int ret = 0;
    Node *p = head;
    while(p != NULL){
        p = p->next;
        ret++;
    }
    return ret;
}

Node* searchX(int x){
    Node *p;
    for(p = head; p != NULL; p = p->next){
        if(p->val == x) break;
    }
    return p;
}

void insHead(int x){
    Node *p;
    p = createN(x);
    p->next = head;
    head = p;
}

void insMiddle(int n, int x){
    int i;
    Node *p, *q;
    p = head;
    for(i = 1; i < n; i++){
        p = p->next;
    }
    q = createN(x);
    q->next = p->next;
    p->next = q;
}

void insTail(int x){
    Node *p;
    p = head;
    if(p == NULL){
        head = createN(x);
        return;
    }
    while(p->next != NULL){
        p = p->next;
    }
    p->next = createN(x);
}

void delHead(){
    Node *p;
    if (head == NULL) return; // 安全対策
    p = head;
    head = head->next;
    free(p);
}

void delMiddle(int n){
    int i;
    Node *p, *q;
    p = head;
    for(i = 1; i < n - 1; i++){
        p = p->next;
    }
    q = p->next;
    p->next = q->next;
    free(q);
}

void delTail(){
    Node *p;
    p = head;
    if (p == NULL || p->next == NULL) {
        freeL();
        return;
    }
    while(p->next->next != NULL){
        p = p->next;
    }
    free(p->next);
    p->next = NULL;
}

void push(int x){
    insHead(x); 
}

int pop(){
    if (head == NULL) return -1; 
    
    int val = head->val; 
    delHead();           
    return val;          
}

void enqueue(int x){
    insTail(x);
}

int dequeue(){
    if (head == NULL) return -1; 
    
    int val = head->val; 
    delHead();           
    return val;          
}

int main(void){
    int s1, s2, s3, q1, q2, q3;

    // スタックのテスト
    push(1);
    push(2);
    push(3);
    s1 = pop();
    s2 = pop();
    s3 = pop();
    printf("%d %d %d\n", s1, s2, s3); 

  
    enqueue(1);
    enqueue(2);
    enqueue(3);
    q1 = dequeue();
    q2 = dequeue();
    q3 = dequeue();
    printf("%d %d %d\n", q1, q2, q3); 

    freeL();
    return 0;
}