6강 / 20강

스택 — 마지막에 쌓은 접시를 먼저

실행 취소(Ctrl+Z)가 동작하는 원리

스택 — 마지막에 쌓은 접시를 먼저
스택은 쌓아 둔 접시 더미입니다. 넣는 곳도 빼는 곳도 맨 위 하나뿐.

싱크대에 접시를 쌓았습니다. 이제 하나를 꺼내려면? 맨 위 것부터죠. 맨 아래 접시를 꺼내려면 위를 다 치워야 합니다.

이렇게 마지막에 넣은 것이 가장 먼저 나오는 규칙을 LIFO(Last In, First Out)라고 하고, 이 규칙을 지키는 자료구조가 스택(stack)입니다.

⬇️
push
맨 위에 올려놓기
⬆️
pop
맨 위 것 꺼내기
👀
peek
맨 위 것 보기만

파이썬에는 Stack 이라는 이름의 자료형이 따로 없습니다. 리스트의 append() 와 pop() 이 이미 정확히 스택이기 때문이에요.

리스트 두 함수만으로 스택이 완성됩니다.
Python 브라우저에서 실행

🎮 접시를 직접 쌓아 보세요

넣기와 빼기를 반복하면서 항상 맨 위에서만 일이 일어나는 걸 확인해 보세요. 빈 스택에서 꺼내려 하면 어떻게 되는지도 눌러 보시고요.

접시 더미 — push · pop · peek 를 직접 해 봅니다
불러오는 중…

쓸모 ① 실행 취소 (Ctrl+Z)

여러분이 글을 쓸 때마다 프로그램은 직전 상태를 스택에 쌓아 둡니다. Ctrl+Z를 누르면 스택에서 하나 꺼내 되돌리죠. 그래서 가장 최근 것부터 취소되는 겁니다.

Ctrl+Z 를 12줄로 만들어 봅니다.
Python 브라우저에서 실행

쓸모 ② 괄호 짝 맞추기

여는 괄호를 만나면 쌓고, 닫는 괄호를 만나면 꺼내서 짝이 맞는지 봅니다. 끝났을 때 스택이 비어 있으면 완벽하게 맞은 거예요. 코드 편집기가 괄호 오류를 잡아내는 방법이 바로 이겁니다.

편집기가 괄호를 검사하는 실제 알고리즘입니다.
Python 브라우저에서 실행
브라우저의 ← → 버튼을 스택 두 개로 재현합니다.
Python 브라우저에서 실행
🤔 확인 문제
스택에 1, 2, 3 을 순서대로 넣은 뒤 두 번 꺼내면 나오는 순서는?
🤔 확인 문제
다음 중 스택이 가장 어울리지 않는 상황은?
🤔 확인 문제
파이썬 리스트로 스택을 만들 때 pop() 대신 pop(0) 을 쓰면?