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.java
emptyCheck()
at the right places, to ensure the appropriate
methods fail when necessary.
ArrayIntStack.java
Note: If you use ArrayList you will receive no credit for the assignment.
IntStackTest.java
ArrayIntStackTest.java
ListIntNode
ListIntNode.java
that implements the Node class we
discussed. It should have an int item
, and a ListIntNode next
reference as
components.
ListIntStack.java
ListIntStackTest.java
rpn.model
package, you will find the following
classes:
RPNCalc.java
addTerm(String term)
getLastValue()
getNextToLastValue()
RPNCalcTest.java
Op.java
TimeTest.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 |