LeetCode 데일리 챌린지 시리즈 #1
문제 설명
두 개의 대기열만 사용하여 후입선출(LIFO) 스택을 구현합니다. 구현된 스택은 일반 스택의 모든 기능(push, top, pop 및 empty)을 지원해야 합니다.
해결책
코드를 구현하기 전에 진행 방법에 대해 생각해 봅시다. 이 문제를 해결하는 방법에는 두 가지가 있습니다.
결정은 신청서를 기반으로 합니다. 우리의 경우에는 어느 쪽이든 괜찮습니다.
비싼 푸시 방법:
나머지 요소가 Queue1에 저장되는 동안 요소를 Queue2로 푸시합니다. 그런 다음 Queue1에서 요소를 팝하고 Queue2로 푸시합니다. Queue1과 Queue2의 이름을 바꿉니다.
새 요소가 추가될 때마다 이 프로세스를 반복하면 스택에서 튀어나올 것으로 예상되는 순서대로 요소를 갖게 됩니다. 따라서 우리는 스택을 달성했습니다.
비싼 팝 방법:
팝해야 할 때마다 - Queue1에서 마지막 요소를 제외한 모든 요소를 대기열에서 빼고 Queue2에 넣습니다. Queue1에서 마지막 요소를 대기열에서 빼고 저장합니다(반환할 결과임). Queue1과 Queue2의 이름을 바꿉니다. 저장된 요소를 반환합니다. 따라서 우리는 터지는 동안 LIFO 주문을 갖게 될 것입니다.
대기열의 길이를 취하십시오. n이라고 말하십시오.
요소를 대기열에 넣습니다.
n까지 루프를 실행합니다. 큐에서 요소를 제거하고 큐에 넣습니다. 이렇게 하면 새 요소가 대기열의 첫 번째 요소가 됩니다.
대기열에서 새 요소를 푸시할 때마다 이 작업을 계속 수행하면 대기열에서 예상한 대로 요소가 올바른 순서로 배치됩니다.
대기열에서 요소의 순서를 수정했기 때문에 팝 작업은 대기열에서 빼서 요소를 반환하는 것처럼 간단해야 합니다.
암호
다음은 단일 대기열을 사용하여 스택을 처리하는 클래스의 Python 구현입니다.
from collections import deque
class MyStack:
def __init__(self):
self.q1 = deque()
def push(self, x: int) -> None:
size = len(self.q1)
self.q1.append(x)
for i in range(size):
el = self.q1.popleft()
self.q1.append(el)
def pop(self) -> int:
return self.q1.popleft()
def top(self) -> int:
return self.q1[0]
def empty(self) -> bool:
return len(self.q1) == 0
참고: 여기에서는 Python의 deque 컬렉션을 사용하고 있지만 일반 대기열로만 사용하고 있습니다. 우리는 deque의 양방향 속성을 사용하지 않았습니다.
Reference
이 문제에 관하여(LeetCode 데일리 챌린지 시리즈 #1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/asi309/leetcode-daily-challenge-series-1-18o0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)