Het shunting-yardalgoritme (rangeerstationalgoritme) is een methode om een mathematische uitdrukking geschreven in infixnotatie te verwerken. Het algoritme is uitgevonden door de Nederlandse wetenschapper Edsger Dijkstra. De metafoor met het rangeerstation vindt zijn oorsprong daarin dat de werking van het algoritme lijkt op het samenstellen van treinstellen in een rangeerstation.
Het shunting-yardalgoritme is een stack-based algoritme. De infixuitdrukkingen zijn het meest gangbaar in wiskundige kringen, zoals 3 + 4 of 3 + 4 × (2 − 1). De conversie naar de postfixnotatie gebeurt door middel van een input- en een outputtekst die beide in een stack zitten. Een derde stack houdt de operators bij die nog niet aan de output zijn toegevoegd. Om de omzetting door te voeren, leest het programma elk symbool in en voegt dit, afhankelijk van het symbool, toe op de juiste stack.
3+4
3
in de output stack (als er een nummer gelezen wordt, steeds in de output)+
op de operator stack4
in de output3 4 +
Dit eenvoudige voorbeeld geeft al meteen een beeld van enkele regels:
operator | voorrang | associativiteit |
---|---|---|
^ |
4 | Rechts |
* |
3 | Links |
/ |
3 | Links |
+ |
2 | Links |
− |
2 | Links |
Token | Actie | Output (in RPN) | Operator stack | Opmerking |
---|---|---|---|---|
3 |
Token toevoegen aan output | 3 |
||
+ |
Push token op stack | 3 |
+ |
|
4 |
Token toevoegen aan output | 3 4 |
+ |
|
* |
Push token op stack | 3 4 |
* + |
* heeft hogere voorrang dan +
|
2 |
Token toevoegen aan output | 3 4 2 |
* + |
|
/ |
Pop stack op output | 3 4 2 * |
+ |
/ en * hebben dezelfde voorrang
|
Push token op stack | 3 4 2 * |
/ + |
/ heeft hogere voorrang dan +
| |
( |
Push token op stack | 3 4 2 * |
( / + |
|
1 |
Token toevoegen aan output | 3 4 2 * 1 |
( / + |
|
− |
Push token op stack | 3 4 2 * 1 |
− ( / + |
|
5 |
Token toevoegen aan output | 3 4 2 * 1 5 |
− ( / + |
|
) |
Pop stack op output | 3 4 2 * 1 5 − |
( / + |
Herhaald tot ( wordt gevonden
|
Pop stack | 3 4 2 * 1 5 − |
/ + |
Overeenkomstige haakjes weggooien | |
^ |
Push token op stack | 3 4 2 * 1 5 − |
^ / + |
^ heeft hogere voorrang dan /
|
2 |
Token toevoegen aan output | 3 4 2 * 1 5 − 2 |
^ / + |
|
^ |
Push token op stack | 3 4 2 * 1 5 − 2 |
^ ^ / + |
^ wordt van links naar rechts geëvalueerd
|
3 |
Token toevoegen aan output | 3 4 2 * 1 5 − 2 3 |
^ ^ / + |
|
einde | Volledige stack op de output zetten | 3 4 2 * 1 5 − 2 3 ^ ^ / + |