: 데이터를 쌓아서 관리하는 방식 혹은 저장소
cf) 함수 호출 시 스택 메모리 사용
import java.util.Stack;
// Stack<래퍼클래스> 변수명 = new Stack<>();
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(10);
stack.pop(); // 10 삭제 -> return 10
stack.peek(); // return 1
stack.get(0); // 인덱스로 조회 -> return 1
stack.size(); // 1
stack.empty(); // false
stack.contains(1); // true
# 생성
stack = []
# 값 추가
stack.append(1)
# 상단의 값 삭제 및 반환
stack.pop()
# 상단의 값 반환
stack[-1]
deque (double-ended queue) : 앞뒤에서 삽입, 삭제가 가능한 큐
→ stack, queue 등으로 사용 가능
from collections import deque
# 생성
stack = deque()
# 값 추가
stack.append(1) # deque([1])
# 상단의 값 삭제 및 반환
stack.pop()
# 상단의 값 반환
stack[-1]
: 자기 자신을 재참조
: 자기 자신을 호출하는 함수
→ 재귀 함수 호출 시 이름만 같은 다른 메소드가 스택 메모리에 계속 쌓이므로,
반복문에 비해 메모리 및 속도 성능저하 발생 가능
Call stack : 함수가 끝나면 돌아갈 위치를 기록해두는 곳
→ call stack이 너무 많이 쌓이면 Stack Over Flow Error 발생
→ 출력 : 5 4 3 2 1 0 1 2 3 4 5
public void main(String[] args) {
recur(5, 0);
}
void recur(int level, int end) {
// base case
if(level == end) {
System.out.println(level);
return; // 함수 끝!
}
// recursive case
System.out.println(level);
recur(level - 1, end);
System.out.println(level);
}
: 동일한 계산을 다시 수행하지 않도록 메모리에 저장하는 방식
→ Dynamic Programming (한 번 계산한 결과 재활용)