Implement Queue using Stacks

java dev.to

Problem Statement

Implement a Queue using Stack operations only.

Support:

push()
pop()
peek()
empty()
Enter fullscreen mode Exit fullscreen mode

Brute Force Intuition

Use one stack.

For dequeue:

Reverse stack
Remove front
Reverse again
Enter fullscreen mode Exit fullscreen mode

Very expensive.


Moving Towards the Optimal Approach

Use:

st1  Incoming Elements

st2  Outgoing Elements
Enter fullscreen mode Exit fullscreen mode

Whenever:

st2 becomes empty
Enter fullscreen mode Exit fullscreen mode

Move everything from:

st1  st2
Enter fullscreen mode Exit fullscreen mode

This reverses order automatically.


Pattern Recognition

Queue
+
Stack

=> Two Stack Reversal
Enter fullscreen mode Exit fullscreen mode

Key Observation

Input:

1 2 3 4
Enter fullscreen mode Exit fullscreen mode

Stored:

st1

4
3
2
1
Enter fullscreen mode Exit fullscreen mode

Transfer:

st2

1
2
3
4
Enter fullscreen mode Exit fullscreen mode

Now Queue order appears.


Optimal Java Solution

class MyQueue {

    Stack<Integer> st1;
    Stack<Integer> st2;

    public MyQueue() {

        st1 = new Stack<>();
        st2 = new Stack<>();
    }

    public void push(int x) {

        st1.push(x);
    }

    private void transfer() {

        if (st2.isEmpty()) {

            while (!st1.isEmpty()) {

                st2.push(st1.pop());
            }
        }
    }

    public int pop() {

        transfer();

        return st2.pop();
    }

    public int peek() {

        transfer();

        return st2.peek();
    }

    public boolean empty() {

        return st1.isEmpty()
            && st2.isEmpty();
    }
}
Enter fullscreen mode Exit fullscreen mode

Dry Run

push(1)

push(2)

push(3)
Enter fullscreen mode Exit fullscreen mode

Stacks:

st1

3
2
1
Enter fullscreen mode Exit fullscreen mode

Need dequeue.

Transfer:

st2

1
2
3
Enter fullscreen mode Exit fullscreen mode

Pop:

1 removed
Enter fullscreen mode Exit fullscreen mode

Queue order maintained.


Complexity Analysis

Operation Complexity
Push O(1)
Pop Amortized O(1)
Peek Amortized O(1)
Empty O(1)

Interview One-Liner

Use one stack for insertion and another for removal. Transfer only when the output stack becomes empty.


Pattern Learned

Stack Using Queue
→ Rotation

Queue Using Stack
→ Reversal

Stack Using Array
→ Top Pointer

Queue Using Array
→ Front/Rear Management
Enter fullscreen mode Exit fullscreen mode

Source: dev.to

arrow_back Back to Tutorials