Single Queue

class MyStack:
    #  tc O(1) sc O(1)
    def __init__(self):
        self.q = collections.deque()
        
    # tc O(1) 
    def push(self, x: int) -> None:
        self.q.append(x)
        size = len(self.q)
        for i in range(size-1):
            tmp = self.q.popleft()
            self.q.append(tmp)
        
        
    # tc O(N)  sc O(N)
    def pop(self) -> int: 
        return self.q.popleft()
        
    # tc O(1)
    def top(self) -> int:
        return self.q[0]   
    
    # tc O(1)
    def empty(self) -> bool:
        return not self.q

Double Queue

class MyStack:
    #  tc O(1) sc O(1)
    def __init__(self):
        self.q1 = collections.deque()
        self.q2 = collections.deque()
        self.last = 0 
    # tc O(1) 
    def push(self, x: int) -> None:
        if self.last == len(self.q1):
            self.q1.append(x)  
        else:
            self.q1[self.last] = x 
        self.last += 1
    # tc O(N)  sc O(N)
    def pop(self) -> int:
        i = self.last -1
        while i >= 0 :
            self.q2.append(self.q1[i])
            i -= 1
        self.last -= 1 
        return self.q2.popleft()
        
    # tc O(1)
    def top(self) -> int:
        return self.q1[self.last-1]
        
    # tc O(1)
    def empty(self) -> bool:
        return self.last == 0 
        


# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()