Queue using Two Stacks

  • + 0 comments

    Python Queue class:

    class Queue:
        
        def __init__(self):
            self.inp = []    # add newcomers to enqueue
            self.out = []    # pop to dequeue, transfer if empty
        
        def transfer(self) -> None:
            """
            Transfer elements from input -> output stack to 
            reverse order of elements and maintain FIFO order.
            Utilising .append() and .pop() which are O(1).
            """
            if not self.out:        # if output stack is empty  
                while self.inp:
                    self.out.append(self.inp.pop())
            
        def enqueue(self, x: int) -> None:
            self.inp.append(x)
            
        def dequeue(self) -> int:
            self.transfer()
            return self.out.pop()
            
        def peek(self) -> int:
            self.transfer()
            return self.out[-1]
    

    Main:

    if __name__ == "__main__":
        
        q = Queue()
        
        n = int(input())    # no. of queries
        for _ in range(n):
            query = list(map(int, input().split()))
            if query[0] == 1:       # queue()
                value = query[1]
                q.enqueue(value)
            elif query[0] == 2:     # dequeue()
                q.dequeue()
            elif query[0] == 3:     # print()
                print(q.peek())     # view element at front of queue
    

    `