2 + 3 * 5 is ambiguous by itself, only
looking at syntax. To resolve it
properly we need to use the order of operations: Multiplication, then Division, then Addition,
then Subtraction, or use parenthesis to force our order. (2 + 3) * 5
is different than 2 + (3 * 5).
Alternately, we can use
Reverse
Polish Notation to embed the precedence in the expression. By placing the operator
at the end instead of in the middle of the two operands, we know exactly
what operation to perform when. Our ambiguity disappears, since the above expression
will need to be written as
2 3 5 * + or
2 3 + 5 * depending on the desired result.
This model of mathematical operators can be implemented with a stack. When the calculator sees an integer, it should be added to the stack. When it sees an operator (*, +, /, -, %), it should pop the two most recent elements from the stack, perform the operation, and then push the result back on the stack.
When the order of the operation matters, such as a - b, then your
code should use the first element popped as b and the
second element popped as a.
StackViewer class in the numstack package, written
using JavaFX. Run this program to see a text box for entry and a listing below
of the current contents of the stack.
Currently, the StackViewer does not work, because it is missing a stack implementation. You must implement two versions of a stack, one using an array, and the second using a list of nodes.
numstack.model package, you will find the following
classes:
IntStack.javaemptyCheck() at the right places, to ensure the appropriate
methods fail when necessary.
ArrayIntStack.javaNote: If you use ArrayList you will receive no credit for the assignment.
IntStackTest.javaArrayIntStackTest.javaListIntNodeListIntNode.java that implements the Node class we
discussed. It should have an int item, and a ListIntNode next reference as
components.
ListIntStack.java
ListIntStackTest.javarpn.model package, you will find the following
classes:
RPNCalc.javaaddTerm(String term)getLastValue()getNextToLastValue()RPNCalcTest.javaOp.javaTimeTest.java| Cumulative Progress | Points Earned |
|---|---|
| Pass all tests for the ArrayIntStack implementation | 10 |
| Pass all tests for the ListIntStack implementation | 13 |
| Pass all tests for the RPN Calculator | 16 |
| Write a short document comparing the running times of ArrayIntStack and ListIntStack using TimeTest | 18 |
| Rerun TimeTest with 106, 107, and 108 items, and analyze the results in your document | 20 |