
위키백과
- 물건을 쌓아 올리듯 자료를 쌓아 올린 후입선출(LIFO, Last-In-First-Out)형태의 자료구조
- FIFO(선입선출) : 먼저 삽입한 자료를 먼저 꺼내는 방식(ex. Stack)
- LIFO(후입선출) : 가장 나중에 꺼낸 자료부터 꺼내는 방식(ex. Queue)
- 스택에 저장된 자료는 선형 구조를 가짐
- 선형 구조 : 자료 간의 관계가 1:1의 관계
- 비선형 구조 : 자료 간의 관계가 1:N의 관계 (Ex. 트리)
스택의 구현

https://images.app.goo.gl/aei6cALjvUhK2WN86
- 자료 구조 : 자료를 선형으로 저장할 저장소
- 배열 사용
- 저장소 자체를 스택이라 부름
- 스택에서 마지막 삽입된 원소의 위치를 top이라 함
- 일반적으로 스택에서 사용되는 연산
Stack Overflow
- 프로그램 호출 stack에서 이용 가능한 공간 이상을 사용하는 경우, stack overflow가 발생
스택의 구현
class Stack():
def __init__(self):
self.stack = []
def push(self, data):
self.stack.append(data)
def pop(self):
if self.isEmpty():
print("stack is empty")
else:
return self.stack.pop()
def peek(self):
if self.isEmpty():
print('stack is empty')
else:
self.stack[-1]
def isEmpty(self):
if len(self.stack) == 0:
return True
else:
return False
스택의 활용
중위 표기법(Infix Notation)
- 연산자를 두 피연산자 사이에 표기하는 방법
- 가장 일반적으로 사용되는 표현법 ex) A+B
전위 표기법(Prefix Notation)
- 연산자를 먼저 표기하고 피연산자를 나중에 표기하는 방법 ex) +AB
- 중위 표기법 → 전위 표기법 변환
-
연산자의 우선순위에 따라 괄호 표기
-
괄호 안에 있는 각 연산자들을 왼쪽 괄호 앞으로 이동
-
괄호 제거
ex) A*B-C/D
- ((A*B)-(C/D))
- -(*(A B)/(C D))
- -*AB/CD
후위 표기법(Postfix Notation)
- 피연산자를 먼저 표기하고 연산자를 나중에 표기하는 방법
- 컴파일러가 사용하는 것으로, 스택을 이용하는 경우 빈번하게 사용 ex) AB+
- 중위 표기법 → 후위 표기법 변환 방법
-
수식의 각 연산자에 대해 우선순위에 따라 괄호 표기
-
괄호 안에 있는 각 연산자들을 오른쪽 괄호 뒤로 이동
-
괄호 제거
ex) A*B-C/D
- ((A*B)-(C/D))
- ((A B)* (C D)/)-
- AB*CD/-
백트래킹
- 백트래킹(Backtracking) 기법은 해를 찾는 도중에 막히면(해가 아닌 경우) 되돌아가서 다시 해를 찾아가는 기법
- 백트래킹 기법은 최적화(Optimization) 문제와 결정(Decision) 문제를 해결할 수 있음
- 상태 공간 트리의 깊이 우선 탐색(DFS)을 실시
- 각 노드의 유망성(해답이 될 가능성)을 점검한 후, 유망(promising)하지 않다고 결정되면 그 노드의 부모로 되돌아가(Backtracking) 다음 자식 노드로 이동
- 가지치기(pruning) : 유망하지 않는 노드가 포함되는 경로는 더 이상 고려하지 않음.
- 결정문제 : 문제의 조건을 만족하는 해가 존재하는지의 여부를 yes, 또는 no가 답하는 문제
- 미로찾기
- n-Queen 문제
- Map coloring
- 부분 집합의 합(Subset Sum) 문제 등
백트래킹과 DFS의 차이
- DFS는 모든 경로를 추적하는데 비해 백트래킹은 불필요한 경로를 조기에 차단.
- DFS는 많은 경우의 수가 생기지만, 백트래킹 알고리즘을 적용하면 일반적으로 경우의 수가 줄어듦 (물론, 최악의 경우 지수함수 시간을 요구)