https://bfe.dev is like a LeetCode for FrontEnd developers. I’m using it to practice my skills.
This article is about the coding problem BFE.dev#108. Implement a Stack by using Queue
Look at the interface
/* you can use this Queue which is bundled together with your code
class Queue {
  enqueue(element) {
    // add new element to the queue
  }
  peek() { 
    // return the head element
  }
  dequeue() { 
    // remove head element from the queue
  }
  size() { 
    // return the queue size
  }
}
*/
// you need to complete the following Stack, using only Queue
class Stack {
  push(element) {
    // push an element into the stack
  }
  peek() { 
    // get the top element 
  }
  pop() { 
    // remove top element from stack
  }
  size() { 
    // return count of elements
  }
}
Let's say we have a queue
[1,2,3,4]
now we need to pop 4 , but since it is a queue, we could only dequeue 1 out, so in order to get 4, we need to dequeue all other 3 elements, and put them in another queue (because we are not permitted to use Array).
[4], [1,2,3]
now we could get 4 out
[ ] , [1,2,3]
We could enqueue the elements back, and repeat above process. But actually we cannot implement peek() with this, we cannot afford dequeueing all elements just for peek().
To solve this problem, we should always keep a queue of only one elements, so we could peek() and pop(), like below:
[ ], [ ] 
when adding 1, just enqueue it
[1], [ ]
when adding 2, enqueue it, and then dequeue 1 to another queue.
[1,2], [ ]
[2], [1]
when adding 3, 4 just do the same
[2,3], [1]
[3], [1,2]
[3,4], [1,2]
[4], [1,2,3]
now we can just dequeue 4
[ ], [1,2,3]
since one queue is empty, let's try to set the other queue to 1 elements
[1,2], [3]
we now could just switch these 2 queues, we could see that this is the case we processed before.
[3], [1, 2]
Cool, so we just need to have 2 queues
- 
queue1which always have 1 element(or empty) - 
queueRestwhich is to hold other elements. 
Let's write some code
The code is just an exact reflection of above process, so no more detailed explanation here.
class Stack {
  constructor() {
    this.queue1 = new Queue()
    this.queueRest = new Queue()
  }
  push(element) {
    this.queue1.enqueue(element)
    this._move()
  }
  _move() {
    while (this.queue1.size() > 1) {
      this.queueRest.enqueue(this.queue1.dequeue())
    }
  }
  peek() { 
    return this.queue1.peek()
  }
  pop() {
    if (this.queue1.size() === 0) {
      return undefined
    }
    const element = this.queue1.dequeue()
    // swap if the other queue is not empty
    if (this.queueRest.size() > 0) {
      ;[this.queue1, this.queueRest] = [this.queueRest, this.queue1]
      this._move()
    }
    return element
  }
  size() { 
    return this.queue1.size() + this.queueRest.size()
  }
}
Passed! Yeah~
If you are interested, have a try at BFE.dev https://bigfrontend.dev/problem/Implement-a-Stack-by-using-Queue
Hope it helps, see you next time!


    
Top comments (0)