Modeling The Shunting-Yard Algorithm
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
Introduction
The Shunting-Yard algorithm, invented by Edsger Dijkstra, is an efficient method for parsing mathematical expressions specified in infix notation. The algorithm can transform infix expressions, which are typically human-readable and written with operators between operands, into postfix expressions (also known as Reverse Polish Notation or RPN) that are more suitable for machine processing. This in-depth article covers the inner workings of the Shunting-Yard algorithm, explaining its modeling through detailed examples and technical explanations.
How the Shunting-Yard Algorithm Works
The Shunting-Yard algorithm uses a stack to temporarily hold operators and parentheses while it constructs the postfix expression. The central idea is to read the input from left to right, converting it to postfix by making operator precedence and associativity decisions.
Technical Breakdown
The algorithm handles different types of tokens as follows:
- Operands (Numbers/Variables): Push directly to the output queue.
- *Operators (+, -, , /, etc.):
- Pop from the stack to the output queue until an operator with lower precedence is encountered.
- If operators have the same precedence, associativity rules are used:
- Left associative operators: Pop from the stack.
- Right associative operators: Do not pop for equal precedence, push the current operator.
- Push the current operator onto the stack.
- Left Parenthesis `(`: Push onto the stack.
- Right Parenthesis `)`:
- Pop from the stack to the output until a left parenthesis is encountered.
- Discard the left parenthesis from the stack.
Example
Consider the infix expression: `3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3`
Following the algorithm:
- 3 → Output Queue: `3`
- + → Operator Stack: `+`
- 4 → Output Queue: `3 4`
- * → Operator Stack: `+ *`
- 2 → Output Queue: `3 4 2`
- / → Operator Stack: `+ * /` (Since * and / have the same precedence and are left-associative)
- ( → Operator Stack: `+ * / (`
- 1 → Output Queue: `3 4 2 1`
- - → Operator Stack: `+ * / ( -`
- 5 → Output Queue: `3 4 2 1 5`
- ) → Pop from stack until `(`: Output Queue: `3 4 2 1 5 -`
- ^ → Adjust for right-associative: Operator Stack: `+ * / ^`
- 2 → Output Queue: `3 4 2 1 5 - 2`
- ^ → Operator Stack: `+ * / ^ ^` (Right-associative, same precedence)
- 3 → Output Queue: `3 4 2 1 5 - 2 3`
- Complete remaining operations until the stack is empty: `3 4 2 * 1 5 - 2 3 ^ ^ / +`
Table of Key Points
| Token Type | Action |
| Operand | Push to output queue |
| Operator | Pop to output if precedence is higher or equal & left-associative; Push operator to stack |
Left ( | Push to stack |
Right ) | Pop until left ( is found; excludes the ( from output |
| End | Pop all operators in the stack |
Additional Details and Subtopics
Handling Operator Precedence and Associativity
Precedence is a key aspect of the Shunting-Yard algorithm. For mathematical expressions to evaluate correctly, operators with higher precedence must be executed first. Associativity further guides the order of operations for operators at the same level of precedence.
- Precedence Example: In the expression `a + b * c`, multiplication `` has higher precedence than addition `+`, hence `bc` is evaluated first.
- Associativity Example: For the left-associative `+` operator in `a + b + c`, the expression evaluates as `(a + b) + c`. Right-associative operators, like `^` (exponentiation), evaluate from right to left: `a ^ b ^ c` is `a ^ (b ^ c)`.
Error Handling
The algorithm must handle errors like mismatched parentheses or invalid tokens. This involves:
- Checking if there are any remaining open parentheses in the stack once parsing is complete.
- Ensuring the input expression uses valid numbers, operators, and parentheses.
Implementing the Shunting-Yard Algorithm
The Shunting-Yard algorithm can be implemented in various programming languages. Below is a simple Python implementation:
Related reading
- modular multiplication of large numbers in c
- Monte Carlo Tree Search, Backpropagation Backup step Why change perspective of reward value?
- Moon / Lunar Phase Algorithm
- More efficient algorithm to find OR of two sets
- Most common subset of size k
- Most common substring of length X
- Most efficient algorithm for merging sorted IEnumerableT
- Most efficient code for the first 10000 prime numbers?

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.