Programming/leetcode

232. Implement Queue using Stacks

홍열 2021. 2. 18. 10:16
728x90

stack을 이용해서 queue를 구현하는 것

python의 list는 특정 index에서도 remove가 가능하다. 

 

queue명령어들은 다음과 같다. 

  • void push(int x) Pushes element x to the back of the queue.
    -> queue의 맨 뒤에 넣으면 되겠다/
  • int pop() Removes the element from the front of the queue and returns it.
    -> queue의 맨 앞을 pop하면 되겠다.
  • int peek() Returns the element at the front of the queue.
    -> queue의 맨 앞의 원소 
  • boolean empty() Returns true if the queue is empty, false otherwise.
    -> queue의 길이를 가지고 판단

아래 코드가 통과는 되지만 시간 복잡도에서는 최악이다. 

이유는 list에서 pop을 할 경우에는 다시 재정렬이 필요하기 때문이다.

class MyQueue:

    def __init__(self):
        self.stack = []

    def push(self, x: int) -> None:
        self.stack.append(x)

    def pop(self) -> int:
        return self.stack.pop(0)

    def peek(self) -> int:
        return self.stack[0]

    def empty(self) -> bool:
        return len(self.stack) == 0

 대신 stack을 두개를 써서 하면 push은 O(n), pop은 O(1) 보장할 수 있다. 

 

class MyQueue:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []
        self.front = 0

#추가할때 stack1번을 먼저 다 빼서, stack2에 거꾸로 쌓는다.
#x를 먼저 추가하고, stack2를 다시 옮긴다. 

    def push(self, x: int) -> None:
        while self.stack1:
            self.stack2.append(self.stack1.pop())
        self.front = x
        self.stack1.append(x)

        while self.stack2:
            self.stack1.append(self.stack2.pop())

    def pop(self) -> int:
        return self.stack1.pop()

    def peek(self) -> int:
        return self.stack1[-1]

    def empty(self) -> bool:
        #return len(self.stack) == 0
        return not self.stack1