LeetCode in Kotlin

225. Implement Stack using Queues

Easy

Implement a last-in-first-out (LIFO) stack using only two queues. The implemented stack should support all the functions of a normal stack (push, top, pop, and empty).

Implement the MyStack class:

Notes:

Example 1:

Input [“MyStack”, “push”, “push”, “top”, “pop”, “empty”] [[], [1], [2], [], [], []]

Output: [null, null, null, 2, 2, false]

Explanation:

MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // return 2
myStack.pop(); // return 2
myStack.empty(); // return False 

Constraints:

Follow-up: Can you implement the stack using only one queue?

Solution

import java.util.LinkedList
import java.util.Queue

class MyStack() {
    private val queue1: Queue<Int> = LinkedList()
    private val queue2: Queue<Int> = LinkedList()

    fun push(x: Int) {
        queue1.add(x)
    }

    fun pop(): Int {
        while (queue1.size > 1) {
            queue2.add(queue1.remove())
        }
        val top = queue1.remove()
        queue1.clear()
        queue1.addAll(queue2)
        queue2.clear()
        return top
    }

    fun top(): Int {
        while (queue1.size > 1) {
            queue2.add(queue1.remove())
        }
        val top = queue1.remove()
        queue2.add(top)
        queue1.clear()
        queue1.addAll(queue2)
        queue2.clear()
        return top
    }

    fun empty(): Boolean {
        return queue1.isEmpty()
    }
}

/*
 * Your MyStack object will be instantiated and called as such:
 * var obj = MyStack()
 * obj.push(x)
 * var param_2 = obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.empty()
 */