Stack
- stack(스택)은 나중에 넣은 데이터를 먼저 반환하도록 설계된 메모리구조
Stack의 특징
- LIFO(Last In First Out): 마지막에 넣은 데이터를 가장 먼저 추출하는 데이터 구조
- FILO(First In Last Out): 처음에 넣은 데이터를 가장 마지막에 추출하는 데이터 구조
- 컴퓨터 내부의 프로세스 구조의 함수 동작 방식
- Python에서는 재귀함수 또는 List로 구현
- 시간복잡도: O(1)
- e.g. 책상 위에 차곡차곡 쌓이는 책, 싱크대 위에 쌓이는 접시
Stack의 주요 기능
Push
: Data의 입력
Pop
: Data의 출력
(다만 pop
은 읽어들임과 동시에 stack에서 삭제한다)
Stack의 장점
- 구조가 단순해서, 구현이 쉽다
- 데이저 저장/읽기 속도가 빠르다
Stack의 단점
- 데이터 최대 갯수를 미리 정해야 한다
(파이썬의 경우 재귀 함수는 1000번까지만 호출이 가능)
- 저장 공간의 낭비가 발생할 수 있음
(미리 최대 갯수 만큼 저장 공간을 확보해야 함)
When to use Stack
- 프로그램에서 함수 호출 기록을 stack으로 저장한다.
- web browser 내역 혹은 내역인데 최신 내역이 먼저 나와야 하는 경우
Stack 구현 with Python
재귀함수를 이용한 Stack 예제
def recursive(data):
if data < 0:
print ("ended")
else:
print(data)
recursive(data - 1)
print("returned", data)
recursive(4)
4
3
2
1
0
ended
returned 0
returned 1
returned 2
returned 3
returned 4
list를 사용한 stack 예제
구현 method
- isEmpty: 스택이 비어 있는지 확인
- push: 스택 맨 끝(맨 위)에 항목을 삽입
- pop: 스택 맨 끝 항목을 반환하는 동시에 스택에서 제거
- peek: 스택 맨 끝 항목을 조회
- size: 스택 크기를 조회
class Stack():
def __init__(self):
self.data = list()
def isEmpty(self):
if len(self.data) == 0:
return True
else:
return False
def push(self, value):
self.data.append(value)
def pop(self):
if len(self.data) == 0:
print('Stack is Empty', -1)
else:
data = self.data[-1]
del self.data[-1]
return data
def peek(self):
if self.data:
return self.data[-1]
else:
print('Stack is Empty', -1)
def size(self):
return len(self.data)
def __repr__(self):
return repr(self.data)
if __name__ == "__main__":
stack = Stack()
print('Stack is Empty?:', stack.isEmpty())
print('Insert in Stack 0 to 10')
for i in range(11):
stack.push(i)
print('Stack :', stack)
print('Stack peek:', stack.peek())
for _ in range(5):
print('Stack pop:', stack.pop())
print('Stack :', stack)