View
222
Download
2
Embed Size (px)
Citation preview
Announcements
CIF – cool living space Social Engineering Quiz Project – issued today, due Friday 3/26
Read Weiss Chapter 11 Read about Trees
Weiss Chap 18
WORKSHOP LEADERSHIP
Consider being a CSC 171 workshop leader?Good grade in CSC 171?Belief in the workshop program?Seeking to develop your leadership skills?Pay and credit?
Interest ? “SW Eng & Advanced Java Programming”
The “game course” Multithreading, Graphics, UIs, SWeng
CSC 290 4 credits – normal grading – ok for CSC ULFall term 2004CSC 172 pre-req
Interest?
“Recreational Graphics”The “Maya” course – animation & ray tracingCSC 3901 or 2 credits – pass/fail – CSC credit, but not ULThursdays 4:50-6:05?No pre-reqs
A useful stack algorithm Postfix evaluation
We can rewrite the infix expression 1+2As the postfix expression 1 2 +
“Think” like a computer “load value ‘1’ into accumulator “load value ‘2’ into register A Add value in register A to value in accumulator
How about 1+2+3+4 ?How about 2*3+4?How about 2+3*4?
How to implement?
Can you write method that evaluates postfix expressions?
double postfixeval(Object[] items) Where objects in items[] are either
DoubleCharacter
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
Infix to postfix
1 + 2 * 3
== 7 (because multiplication has higher precedence)
10 – 4 – 3
== 3 (because subtraction proceeds left to right)
Precidence
A few simple rules:
( ) > ^ > * / > + -
Subtraction associates left-to-right
Exponentiation associates right to left
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?
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
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
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?
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
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
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