차량기지 알고리즘은 중위 표기법으로 표현된 수식을 분석할 때 사용할 수 있는 알고리즘이다. 알고리즘의 결과물은 역폴란드 표기법이나 파스 트리가 될 수 있다. 네덜란드의 컴퓨터과학자 에츠허르 데이크스트라가 고안하여 1961년에 발표하였다. 데이크스트라는 알고리즘의 동작이 철도 차량기지의 그것을 닮았다고 하여 차량기지 알고리즘이라는 이름을 붙였다.
역폴란드 표기법의 계산법처럼, 차량기지 알고리즘 또한 스택을 이용한다. 또는 처럼 대부분의 사람들에게 익숙한 중위 표기법을 역폴란드 표기법으로 변환하려면 입력, 출력 및 한개의 연산자 스택이 필요하다.
이 간단한 예제로부터 몇가지 규칙을 살펴볼 수 있다.
연산자 | 우선순위 | 연산자 결합 방향 |
---|---|---|
^ | 4 | 오른쪽 |
* | 3 | 왼쪽 |
/ | 3 | 왼쪽 |
+ | 2 | 왼쪽 |
- | 2 | 왼쪽 |
입력 토큰 | 알고리즘의 동작 | 출력 큐 (역폴란드 표기법) | 연산자 스택 | 비고 |
---|---|---|---|---|
3 | 토큰을 출력 큐에 넣음 | 3 | ||
+ | 토큰을 연산자 스택에 푸쉬 | 3 | + | |
4 | 토큰을 출력 큐에 넣음 | 3 4 | + | |
* | 토큰을 연산자 스택에 푸쉬 | 3 4 | * + | * 의 우선순위가 + 보다 높다 |
2 | 토큰을 출력 큐에 넣음 | 3 4 2 | * + | |
/ | 연산자 스택에서 팝하여 출력 큐에 넣음 | 3 4 2 * | + | / 와 * 의 우선순위는 같다 |
토큰을 연산자 스택에 푸쉬 | 3 4 2 * | / + | / 의 우선순위가 + 보다 높다 | |
( | 토큰을 연산자 스택에 푸쉬 | 3 4 2 * | ( / + | |
1 | 토큰을 출력 큐에 넣음 | 3 4 2 * 1 | ( / + | |
− | 토큰을 연산자 스택에 푸쉬 | 3 4 2 * 1 | − ( / + | |
5 | 토큰을 출력 큐에 넣음 | 3 4 2 * 1 5 | − ( / + | |
) | 연산자 스택에서 팝하여 출력 큐에 넣음 | 3 4 2 * 1 5 − | ( / + | "("를 찾을 때까지 반복 |
스택을 팝함 | 3 4 2 * 1 5 − | / + | 맞는 괄호를 찾았으므로 괄호를 버림 | |
^ | 토큰을 연산자 스택에 푸쉬 | 3 4 2 * 1 5 − | ^ / + | ^ 의 우선순위가 / 보다 높다 |
2 | 토큰을 출력 큐에 넣음 | 3 4 2 * 1 5 − 2 | ^ / + | |
^ | 토큰을 연산자 스택에 푸쉬 | 3 4 2 * 1 5 − 2 | ^ ^ / + | ^ 는 오른쪽 결합 연산자이다 |
3 | 토큰을 출력 큐에 넣음 | 3 4 2 * 1 5 − 2 3 | ^ ^ / + | |
입력 종료 | 스택을 팝하여 출력 큐에 넣음 | 3 4 2 * 1 5 − 2 3 ^ ^ / + |
모든 연산자, 괄호 및 숫자는 단 한번만 입력에서 읽고, 최대 한번만 출력 큐에 입력된다. 연산자 및 괄호는 최대 한번만 스택에 푸쉬된 후 팝되므로, 모든 입력 토큰에 대해 최대 몇개의 연산만이 수행된다. 따라서 알고리즘의 실행시간은 입력 길이에 비례하며, 대문자 O 표기법으로는 O(n)이다.