Python
[Python] - 자료구조 : 스택(Stack) 개념 및 사용
경토리
2023. 2. 13. 20:53
728x90
* Stack(스택)
- 스택은 LIFO(Last - In - First - Out)로써 가장 나중에 들어온 자료가 가장 먼저 꺼내어진다라고 이해하면 쉽다.
1. 정의
- 스택은 데이터를 한 쪽 끝에서만 넣고 뺄 수 있는 자료 구조이다.
- 큐는 대표적으로 FIFO 정책을 사용하지만 스택은 LIFO(Last In First Out) 후입선출 정책을 사용한다.
- 즉 가장 나중에 쌓은 데이터를 가장 먼저 제거할 수 있다. 또한 단어 그대로 쌓아 올린다는 것을 뜻한다.
- 프링글스 과자를 생각하면 쉽다.
2. 스택의 장단점
- -장점
- 구조가 단순해서 구현이 쉽다.
- 데이터 저장/읽기 속도가 빠르다.
- -단점
- 스택에 데이터를 쌓을 수 있는 최대 범위를 미리 정해놓아야한다.
- 이로인해 저장 공간의 낭비가 발생할 수 있다.
3. 스택의 메서드
파이썬 리스트 기능에서 스택은 두 가지 메서드를 제공한다.
- append(push) : 데이터를 집어넣기
- pop : 데이터를 빼기
4. 스택의 쓰임
- 웹브라우저의 방문기록(뒤로가기) : 가장 나중에 열린 페이지부터 다시 보여준다.
- 역순 문자열 만들기
- 실행 취소(undo)
* Python에서 Stack 구현하기
Python에서는 기본 클래스인 list를 통해 스택 자료구조를 쉽게 구현할수있다.
list pop / push 시간복잡도
pop Item | list.pop( ) | O(1) |
push Item | list.append(item) | O(1) |
** list를 이용하여 Stack 구현하기 - 1
stack - Init
list는 파이썬에서 자주 쓰이기 때문에 리스트 자료형 생성은 매우 익숙할거같다.
stack = [] # []
stack = [1,2,3] # [1,2,3]
stack - push
스택에 원소를 넣을 때에는 append 메소드를 이용해 리스트의 가장 마지막에 원소를 넣으실 수 있다.
stack = []
stack.append(4) # [4]
stack.append(2) # [4,2]
stack - pop
스택에 원소를 제거할 때는 pop 메소드를 이용하여 리스트의 가장 마지막 원소를 제거한다.
이때 pop메소드에 의해 제거된 원소를 리턴 받는다.
리스트의 pop(0) 연산은 O(n) 시간 복잡도를 가진다. 즉, 리스트의 첫 번째 요소를 제거하면, 나머지 모든 요소를 왼쪽으로 이동해야 하기 때문에 큐의 크기가 커질수록 성능이 저하된다.
stack = [1,2,3,4]
top = stack.pop() # stack [1,2,3]
print(top) # 4
stack - top
스택에서 원소를 제거하지 않고 가져오기만 할 때에는 [-1]을 이용하여 찾을 수 있다.
stack = [1,2,3,4]
top = stack[-1]# 4 , stack [1,2,3,4]
print(top) # 4
** deque를 사용하여 스택 구현하기 - 2
from collections import deque
stack = deque()
# 스택에 요소 추가 (push)
stack.append(1)
stack.append(2)
stack.append(3)
print(stack) # deque([1, 2, 3])
# 스택에서 맨 뒤의 요소 제거 (pop)
top_element = stack.pop()
print(top_element) # 3
print(stack) # deque([1, 2])
# 스택에서 맨 앞의 요소 제거 (popleft)
print(queue.popleft()) # 1
print(queue.popleft()) # 2
print(queue.popleft()) # 3
- append(): 스택의 맨 위에 요소를 추가한다.
- pop(): 스택의 맨 위에서 요소를 제거하고 반환한다.
- popleft() : 스택의 맨 앞의 요소를 제거하고 반환한다. O(1) 시간 복잡도를 가지며, 이는 리스트의 pop(0)보다 훨씬 효율적이다. 따라서 큐의 크기가 커져도 성능이 일정하게 유지된다.
728x90