대표적인 선형 자료 구조 중 하나로 물건을 쌓아 올리듯 자료를 쌓아 올린 형태의 자료구조

배열을 이용해 구현할 수 있다.리스트 를 이용해서 구현할 수 있다.
append 를 이용해 리스트 마지막에 데이터 삽입# append 를 이용해 리스트 마지막에 데이터 삽입
stack = []
def my_push(item):
stack.append(item)
인덱스 연산을 활용한 구현def my_push(item, size):
global top
top += 1
if top == size:
print("Overflow")
else:
stack[top] = item
size = 10
stack = [0] * size
top = -1
my_push(10, size)
top += 1
stack[top] = 20
def my_pop() :
if len(s) == 0:
print("Underflow")
return
else:
return s.pop # 리스트 s의 마지막 원소 삭
def my_pop():
global top
if top == 1:
print("Underflow")
return 0
else:
top -= 1
return stack[top+1]
print(my_pop())
조건

프로그램에서의 함수 호출과 복귀에 따른 수행 순서를 관리한다.

가장 마지막에 호출된 함수가 가장 먼저 실행을 완료하고 복귀하는 후입 선출 구조이므로, 후입선출 구조의 스택을 이용해 수행 순서를 관리한다.

함수가 자신과 같은 작업을 반복해야 할 때 자기 자신을 다시 호출하는 것 이다.

# 수열의 i번 항을 반환하는 함수를 재귀 함수로 구현 가능하다.
def fibo(n):
if n < 2:
return n
else:
return fibo(n-1) + fibo(n-2)

def recursive(i, N):
if i == N: # 중단 조건
return
else: # 재귀 호출
frecursive(i + 1, N)
엄청난 중복 호출이 존재한다 라는 문제가 발생한다.컴퓨터 프로그램을 실행할 때 이전에 계산한 값을 메모리에 저장해서 매번 다시 계산하지 않도록 하여 전체적인 실행 속도를 빠르게 하는 기술이다.
Memoization을 적용한 피보나치
def fibo(n):
if n >= 2 and memo[n] == 0:
memo[n] = fibo(n-1) + fibo(n-2)
return memo[n]
memo = [0] * (n+1)
memo[0] = 0
memo[1] = 1
깊이 우선 탐색
DFS, 한 방향으로 가능한 한 깊게 탐색한 후, 더 이상 갈 곳이 없으면 되돌아와 다른 방향을 탐색
DFS 알고리즘
1. 시작 정점 v를 결정해 방문한다.
2. 정점 v에서 인접한 정점 중
a. 방문하지 않은 정점 w가 있으면 정점 v를 스택에 push, 정점 w를 방문하고, w를 v로 해 다시 2를 반복한다.
b. 방문하지 않은 정점이 없으면 탐색 방향을 바꾸기 위해 스택을 pop, 가장 마지막 방문 정점을 v로 해 다시 2를 반복한다.
3. 스택이 공백이 될 때까지 2를 반복한다.
def dfs(v):
visited = [False] * (N + 1) # 방문 여부
stack = [] # 스택 초기화
visited[v] = True # 시작 정점 방문
print(v, end=' ')
while True:
# 현재 정점 v와 인접한 정점 중
# 아직 방문하지 않은 정점 w 찾기
for w in graph[v]:
if not visited[w]:
stack.append(v) # 현재 위치 저장
v = w # 다음 정점으로 이동
visited[v] = True
print(v, end=' ')
break
# 방문할 정점이 없는 경우
else:
if stack:
v = stack.pop() # 이전 정점으로 되돌아감
else:
break # 스택도 비었으면 DFS 종료