Queue using Two Stacks

  • + 0 comments

    This code works

    class Queue:
        def __init__(self):
            self.stack1 = [] # queue
            self.stack2 = [] # dequeue
        
        def enqueue(self, x):
            self.stack1.append(x)
        
        def dequeue(self):
            # stack 1 and stack 2 are empty
            if not self.stack1 and not self.stack2:
                return None
                
            # if stack 2 is empty, transfer stack 1 into stack 2
            if not self.stack2:
                while self.stack1:
                    self.stack2.append(self.stack1.pop())
    
            return self.stack2.pop()
            
        def peek(self):
            # If stack2 is empty, transfer elements from stack1
            if not self.stack2:
                while self.stack1:
                    self.stack2.append(self.stack1.pop())
    
            # Peek at the front element from stack2
            if not self.stack2:
                # If both stacks are empty, the queue is empty
                return None
            return self.stack2[-1]
    
    
    if __name__ == '__main__':
        
        queue = Queue()
        n_queries = int(input())
    
        for _ in range(n_queries):
            query = input()
            if " " in query:
                if query.split()[0] == "1":
                    queue.enqueue(query.split()[1])
            else:
                if query == "2":
                    queue.dequeue()
                if query == "3":
                    print(queue.peek())