// implementation of Queue using 2 stacks
// contribution made by hamza chabchoub for a university project

class Queue {
  constructor () {
    this.inputStack = []
    this.outputStack = []
  }

  // Push item into the inputstack
  enqueue (item) {
    this.inputStack.push(item)
  }

  dequeue (item) {
    // push all items to outputstack
    this.outputStack = []
    if (this.inputStack.length > 0) {
      while (this.inputStack.length > 0) {
        this.outputStack.push(this.inputStack.pop())
      }
    }
    // display the top element of the outputstack
    if (this.outputStack.length > 0) {
      console.log(this.outputStack.pop())
      // repush all the items to the inputstack
      this.inputStack = []
      while (this.outputStack.length > 0) {
        this.inputStack.push(this.outputStack.pop())
      }
    }
  }

  // display elements of the inputstack
  listIn () {
    let i = 0
    while (i < this.inputStack.length) {
      console.log(this.inputStack[i])
      i++
    }
  }

  // display element of the outputstack
  listOut () {
    let i = 0
    while (i < this.outputStack.length) {
      console.log(this.outputStack[i])
      i++
    }
  }
}

// testing

const queue = new Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(8)
queue.enqueue(9)

console.log(queue.dequeue())
// ans = 1
console.log(queue.dequeue())
// ans = 2

QueueUsing2Stacks