LeetCode Exercise

Logo

This is my LeetCode exercise.
You can see all question I did here.

View the Project on GitHub YaoyuanHsu/LeetCode_Exercise

tags: leetcode easy Stack Design Queue

232. Implement Queue using Stacks

Description

Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push, peek, pop, and empty).

Implement the MyQueue class:

Notes:

Examples

Example1

Input [“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
Output [null, null, null, 1, 1, false]

Explanation MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

Constraints:

Follow-up: Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.

Code

typedef struct node {
    int data;
    struct node* next;
} NODE;

typedef struct {
    NODE *head, *tail;
} MyQueue;

MyQueue* myQueueCreate() {
    struct MyQueue* Q = calloc(1, sizeof(MyQueue));
    return Q;
}

void myQueuePush(MyQueue* obj, int x) {
    NODE* tmp = calloc(1, sizeof(NODE));
    tmp->data = x;
    tmp->next = NULL;
    if (!obj->head)
        obj->head = tmp;
    if (!obj->tail)
        obj->tail = tmp;
    else {
        obj->tail->next = tmp;
        obj->tail = obj->tail->next;
    }
}

int myQueuePop(MyQueue* obj) {
    NODE* tmp = obj->head;
    if (!tmp)
        return NULL;
    int data = tmp->data;
    if (obj->head == obj->tail) {
        free(tmp);
        obj->head = NULL;
        obj->tail = NULL;
    } else {
        obj->head = tmp->next;
        free(tmp);
    }
    return data;
}

int myQueuePeek(MyQueue* obj) {
    return obj->head->data;
}

bool myQueueEmpty(MyQueue* obj) {
    return obj->head == NULL;
}

void myQueueFree(MyQueue* obj) {
    NODE *pre, *tmp = obj->head;
    while (tmp != NULL) {
        pre = tmp;
        tmp = tmp->next;
        free(pre);
    }
}

Complexity

Space Time
$O(N)$ $O(1)$

Result