에듀테크 프로젝트 대시보드
션팅 야드 알고리즘
우리가 쓰는 수식 3 + 4 × 2 를 컴퓨터가 계산하기 쉬운 후위 표기법 3 4 2 × + 로 바꾸는 방법
| 표기법 | 예시 | 특징 |
|---|---|---|
| 중위 (infix) | ( 3 + 4 ) × 2 | 사람이 읽기 편함 · 괄호와 우선순위 필요 |
| 후위 (postfix / RPN) | 3 4 + 2 × | 괄호 없음 · 스택으로 바로 계산 |
| 전위 (prefix) | × + 3 4 2 | 괄호 없음 · 오른쪽부터 계산 |
| 연산자 | 우선순위 | 결합 방향 |
|---|---|---|
^ (거듭제곱) | 4 | 오른쪽 (2^3^2 = 2^(3^2)) |
× ÷ | 3 | 왼쪽 |
+ − | 2 | 왼쪽 |
토큰을 왼쪽부터 하나씩 읽으며:
( → 스택에 넣는다.) → 여는 괄호를 만날 때까지 스택에서 꺼내 출력한다. 여는 괄호는 버린다.후위식 3 4 + 2 * 를 왼쪽부터 읽으며: 숫자는 스택에 넣고, 연산자를 만나면 위에서 두 개를 꺼내 계산한 뒤 결과를 다시 넣습니다.
3 → [3]
4 → [3, 4]
+ → 3 + 4 = 7 → [7]
2 → [7, 2]
* → 7 * 2 = 14 → [14]
결과: 14
function toRPN(tokens):
output = [] # 큐
ops = [] # 스택
for t in tokens:
if t is number:
output.push(t)
else if t is operator o1:
while ops not empty and top(ops) is operator o2 and
(prec(o2) > prec(o1) or
(prec(o2) == prec(o1) and o1 is left-assoc)):
output.push(ops.pop())
ops.push(o1)
else if t == '(':
ops.push(t)
else if t == ')':
while top(ops) != '(':
output.push(ops.pop())
ops.pop() # '(' 버림
while ops not empty:
output.push(ops.pop())
return output
WHERE 조건 처리 등 "사람이 쓴 수식을 기계가 평가"해야 하는 거의 모든 곳에서
이 아이디어(또는 그 확장인 Pratt 파서)가 쓰입니다.