스택은 데이터에 대해 제한적으로 접근할 수 있는 구조다.
가장 나중에 쌓은 것부터만 먼저 꺼낼 수 있다.(LIFO)
바구니에 담은 책을 맨 위에서부터만 꺼낼 수 있는 걸 생각하면 되고, 나중에 들어와서 출구에서 가장 가까운 사람이 먼저 나갈 수 있는 걸 생각하면 된다.
밑장빼기 불가
컴퓨터가 이런 구조라고 한다.
흔히 말하는 '재귀함수'라는 걸 사용하면 그 내용이 Stack의 형태로 쌓여있다가 제일 끝에 있는 것부터 결과를 리턴한다.
파이썬에서는 재귀 함수는 1000번까지 호출할 수 있다고 한다. 즉, 바구니에 담을 수 있는 것은 1000개까지라고 할 수 있다.
코드부터 확인.
Push
stack = []
stack.append(10)
stack.append(20)
stack.append(30)
stack.append(40)
stack.append(50)
stack이라는 이름의 빈 리스트를 만든 뒤, 10, 20, 30, 40, 50의 다섯개의 숫자를 append한다.
사실은 Push를 한다고 말해야 정확하다.
[10, 20, 30, 40, 50]
stack의 내용을 확인하면 다음과 같다.
바구니로 치면 제일 아래에 10이 있고 50이 제일 위에 있는 것이다.
(위의 이미지는 visualgo라는 사이트에서 만들었다.)
Pop
stack.pop()
50
Queue 게시물에서 기술한 바와 같이 pop 메소드는 가장 끝에 있는 걸 배출한다. 50이 제일 바구니 위에 있으니 이렇게 50이 출력된 것이다.
Stack구조 직접 구현하기
stack_list = list()
def push(data):
stack_list.append(data)
def pop():
data = stack_list[-1]
del stack_list[-1]
return data
위에서 append 하는 게 사실은 Push를 한다는 것이라고 했는데 이것은 stack의 data in,out이 각각 Push와 Pop으로 표현되기 때문이다.
pop함수에서는 stack_list의 가장 마지막 데이터를 data 변수에 넣은 뒤 stack_list에 있던 맨 마지막 데이터는 삭제하고, data 변수값을 돌려주는 것이다.
for index in range(10):
push(index)
0~9까지 push를 해보고
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
pop()
9
이렇게 맨 마지막에 있는 9가 출력된다.
그 뒤의 stack_list는 다음과 같다.
[0, 1, 2, 3, 4, 5, 6, 7, 8]
'알고리즘&프로그래밍' 카테고리의 다른 글
링크드 리스트(Linked List) (2) | 2021.11.21 |
---|---|
Queue (0) | 2021.11.21 |