본문 바로가기

알고리즘&프로그래밍

Stack

스택은 데이터에 대해 제한적으로 접근할 수 있는 구조다.

가장 나중에 쌓은 것부터만 먼저 꺼낼 수 있다.(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이 제일 위에 있는 것이다.

stack image(https://visualgo.net/ko/list)

(위의 이미지는 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