Design Front Middle Back Queue - Problem

Design a queue that supports push and pop operations in the front, middle, and back.

Implement the FrontMiddleBackQueue class:

  • FrontMiddleBackQueue() Initializes the queue.
  • void pushFront(int val) Adds val to the front of the queue.
  • void pushMiddle(int val) Adds val to the middle of the queue.
  • void pushBack(int val) Adds val to the back of the queue.
  • int popFront() Removes the front element of the queue and returns it. If the queue is empty, return -1.
  • int popMiddle() Removes the middle element of the queue and returns it. If the queue is empty, return -1.
  • int popBack() Removes the back element of the queue and returns it. If the queue is empty, return -1.

Notice that when there are two middle position choices, the operation is performed on the frontmost middle position choice. For example:

  • Pushing 6 into the middle of [1, 2, 3, 4, 5] results in [1, 2, 6, 3, 4, 5].
  • Popping the middle from [1, 2, 3, 4, 5, 6] returns 3 and results in [1, 2, 4, 5, 6].

Input & Output

Example 1 — Basic Operations
$ Input: operations = ["FrontMiddleBackQueue", "pushFront", "pushBack", "pushMiddle", "popFront", "popMiddle", "popBack"], values = [null, 1, 2, 3, null, null, null]
Output: [null, null, null, null, 1, 3, 2]
💡 Note: Initialize queue → pushFront(1): [1] → pushBack(2): [1,2] → pushMiddle(3): [1,3,2] → popFront() returns 1: [3,2] → popMiddle() returns 3: [2] → popBack() returns 2: []
Example 2 — Empty Queue Operations
$ Input: operations = ["FrontMiddleBackQueue", "popFront", "popMiddle", "popBack"], values = [null, null, null, null]
Output: [null, -1, -1, -1]
💡 Note: Initialize empty queue → All pop operations on empty queue return -1
Example 3 — Middle Position Rules
$ Input: operations = ["FrontMiddleBackQueue", "pushMiddle", "pushMiddle", "pushMiddle", "popMiddle"], values = [null, 1, 2, 3, null]
Output: [null, null, null, null, 2]
💡 Note: pushMiddle(1): [1] → pushMiddle(2): [2,1] → pushMiddle(3): [2,3,1] → popMiddle() returns 3 (frontmost middle): [2,1]

Constraints

  • 1 ≤ val ≤ 109
  • At most 1000 calls will be made to pushFront, pushMiddle, pushBack, popFront, popMiddle, and popBack.

Visualization

Tap to expand
Front Middle Back Queue - Two Deques INPUT Two Deques Structure: Deque 1 (Front Half) Deque 2 (Back Half) Operations: 1. FrontMiddleBackQueue() 2. pushFront(1) 3. pushBack(2) 4. pushMiddle(3) 5. popFront() 6. popMiddle() 7. popBack() Values: [null,1,2,3,null,null,null] ALGORITHM STEPS 1 pushFront(1) D1:[1] D2:[] --> Balance D1:[] D2:[1] 2 pushBack(2) D1:[] D2:[1,2] 3 pushMiddle(3) D1:[3] D2:[1,2] --> Balance D1:[1,3] D2:[2] 4 popFront() Return 1, D1:[3] D2:[2] 5 popMiddle() Return 3, D1:[] D2:[2] 6 popBack() Return 2, D1:[] D2:[] Balance Rule: len(D1) == len(D2) or len(D1) == len(D2) - 1 Middle = front of D2 FINAL RESULT Operation Returns: init: null push: null push: null push: null pop: 1 pop: 3 pop: 2 Output Array: [null,null,null,null,1,3,2] OK Final State: D1:[] D2:[] (empty) Key Insight: Use two deques to maintain balance: D1 holds front half, D2 holds back half (and middle). Keep len(D1) <= len(D2) <= len(D1)+1. Middle element is always at front of D2. All operations achieve O(1) time by rebalancing after each push/pop operation. TutorialsPoint - Design Front Middle Back Queue | Two Deques Approach
Asked in
Google 25 Facebook 20 Amazon 18 Microsoft 15
28.0K Views
Medium Frequency
~25 min Avg. Time
890 Likes
Ln 1, Col 1
Smart Actions
💡 Explanation
AI Ready
💡 Suggestion Tab to accept Esc to dismiss
// Output will appear here after running code
Code Editor Closed
Click the red button to reopen