Page 1
Stacks & QueuesInfix Calculator
CSC 172
SPRING 2002
LECTURE 5
Page 2
Workshop sign-up
Still time :Dave Feil-Seifer [email protected]
Ross Carmara [email protected]
Page 3
Infix to postfix
1 + 2 * 3
== 7 (because multiplication has higher precidence)
10 – 4 – 3
== 3 (because subtraction proceeds left to right)
Page 4
Infix to postfix
4 ^ 3 ^ 2== 262144!= 4096
234
234
Generally,
Rather than:
Page 5
Precidence
A few simple rules:
() > ^ > * / > + -
Subtraction associates left-to-right
Exponentiation associates right to left
Page 6
Infix Evaluation
1 – 2 – 4 ^ 5 * 3 * 6 / 7 ^ 2 ^ 2
== -8
(1 – 2) – ( ( ( ( 4 ^ 5) * 3) * 6) / (7 ^ ( 2 ^ 2 ) ) )
Could you write a program to evaluate stuff like this?
Page 7
Postfix
If we expressed
(1 – 2) – ( ( ( ( 4 ^ 5) * 3) * 6) / (7 ^ ( 2 ^ 2 ) ) )
As
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
Then, we could use the postfix stack evaluator
Page 8
Postfix evaluation using a stack
1. Make an empty stack
2. Read tokens until EOFa. If operand push onto stack
b. If operator i. Pop two stack values
ii. Perform binary operation
iii. Push result
3. At EOF, pop final result
Page 9
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
Page 10
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
1
Page 11
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
21
Page 12
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
-1
Page 13
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
4-1
Page 14
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
5 4-1
Page 15
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
1024-1
Page 16
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
31024
-1
Page 17
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
3072-1
Page 18
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
63072
-1
Page 19
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
18432-1
Page 20
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
718432
-1
Page 21
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
27
18432-1
Page 22
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
227
18432-1
Page 23
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
47
18432-1
Page 24
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
204118432
-1
Page 25
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
7-1
Page 26
1 2 – 4 5 ^ 3 * 6 * 7 2 2 ^ ^ / -
-8
Page 27
But how to go from infix to postfix? Could you write a program to do it? What data structures would you use
Stack Queue
How about a simple case just using “+” 1+ 2 + 7 + 4 1 2 7 4 + + +
Operands send on to output? Operator push on stack? Pop ‘em all at the end?
Page 28
More complex
2 ^ 5 – 1 == 2 5 ^ 1 –
Modify the simple rule?
If you are an operator, pop first, then push yourself?
1 + 2 + 7 + 4
1 2 + 7 + 4 + ok
Page 29
Even more complex
3 * 2 ^ 5 - 1
3 2 5 ^ * 1 –
If you are an operator:
Pop if the top of the stack is higher precedence than
Page 30
Infix to postfix Stack AlgorithmOperands : Immediately output
Close parenthesis: Pop stack until open parenthesis
Operators: 1. Pop all stack symbols until a symbol of lower
precedence (or a right-associative symbol of equal precedence) appears.
2. Push operator
EOF: pop all remaining stack symbols
Page 31
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
Page 32
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
1
Page 33
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
-
1
Page 34
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
-
1 2
Page 35
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
^-
1 2
Page 36
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
^-
1 2 3
Page 37
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
^^-
1 2 3
Page 38
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
^^-
1 2 3 3
Page 39
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
-
1 2 3 3 ^ ^ -
Page 40
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
(-
1 2 3 3 ^ ^ -
Page 41
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
(-
1 2 3 3 ^ ^ - 4
Page 42
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
+(-
1 2 3 3 ^ ^ - 4
Page 43
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
+(-
1 2 3 3 ^ ^ - 4 5
Page 44
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
*+(-
1 2 3 3 ^ ^ - 4 5
Page 45
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
*+(-
1 2 3 3 ^ ^ - 4 5 6
Page 46
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
-
1 2 3 3 ^ ^ - 4 5 6 * +
Page 47
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
*-
1 2 3 3 ^ ^ - 4 5 6 * +
Page 48
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
*-
1 2 3 3 ^ ^ - 4 5 6 * + 7
Page 49
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
1 2 3 3 ^ ^ - 4 5 6 * + 7 * -
Page 50
1 – 2 ^ 3 ^ 3 – ( 4 + 5 * 6) * 7
1 2 3 3 ^ ^ - 4 5 6 * + 7 * -
((1 – (2 ^ (3 ^ 3))) – (( 4 + (5 * 6)) * 7))
InputTo evaluationstack