In this assignment, you will learn  how to use and program stacks, get an introduction to interpretation by implementing a reverse polish notation calculator, and develop an application within a model-view-controller framework.

1.                   Implement Transparent Stacks

The stack data structure is explained in your textbook on pages 648 to 650.  In this assignment, you will implement a variation of the stack data structure called a transparent stack.

 A stack data type is normally defined as a last-in-first-out linear data structure with two basic operations, push and pop.  Stacks also typically contain two additional operations: peek (sometimes called “top”) and empty.   Normally these four operations are the only operations which can be used on a stack.  As a result, the stack is opaque: you cannot see what is inside it, only what is at the top by using peek.

In this assignment, you should implement a variation of the stack data structure: a transparent stack.  A transparent stack is a stack where not only the top of the stack is visible, but each element also is. More precisely, you need to implement the class TransparentClass which has been specified in the TransparentStack.java file as follows:

·         Implement the specified constructors for TransparentStack

·         You must use a heterogeneous array to store the stack entries (in other words, an array of Object references).

·         The initial size of the array is specified in the initialsize parameter of the TransparentStack constructor.  If no size is specified, the default initialsize is 100.

·         Implement the specified public methods for TransparentStack.

·         If an element needs to be pushed onto a full stack, you should increase the size of the stack by an extra initialsize entries.  To do this, make a new array of the new size, copy the existing elements into the new array, and replace the old array by the new.

·         You do not need to decrease the size of the array when it gets small.

·         You cannot use the Java ArrayList and Stack classes to implement the class TransparentClass.

2.                   Test Transparent Stacks with Visible Stacks

In the first part of the assignment, you were asked to build a transparent stack.  For the rest of the assignment, you will use another stack structure called a visible stack, which is a transparent stack that also has one or more displays.

You do not need to implement a visible stack class because one has been implemented for you in VisibleStack.java.  You will notice that a VisibleStack object contains a reference to a TransparentStack object.  You can therefore test that your TransparentStack objects work properly using the VisibleStack class.  Since VisibleStacks have displays, you can see the contents of your stack as you are pushing and popping elements on it.

VisibleStacks contain an array of displays called viewers.  To add a viewer for your visible stack, simply use the addViewer method.  Three types of viewers have been provided for visible stacks:

·         StackViewer is a very simple text viewer which simply displays the top of the stack. 

·         TextStackViewer displays a text version of the stack.  It is not very nice looking and it is very tedious because the stack is redrawn each time anything happens to it.  However, this can be very useful when you are testing and debugging because it will output everything that happens to the stack using System.out.println and you will have a record of every step, which you can look at carefully.

·         GraphicsStackViewer displays a graphical version of the stack.  This is a much nicer viewer that can be used for final products.

·         TextStackViewer and GraphicsStackViewer are subclasses of StackViewer. 

You do not need to implement anything other than the TransparentStack class to make the three viewer classes and VisibleStack class work.  You should, however, make sure that your TransparentStack class is working properly with these classes before you move on to the next part of the assignment.  If you run into problems, do not change the VisibleStack, StackViewer, TextStackViewer, and GraphicsStackViewer classes because we will be using the ones we gave you to test your TransparentStack class.  You should instead fix your TransparentStack to make it work with the other four classes.


3.                   Implement Reverse Polish Notation Calculator

The first serious handheld scientific calculators produced by Hewlett-Packard in 1972 used reverse polish notation, also called postfix notation, which works are follows:  instead of entering binary operations in infix notation <operand1> <operator> <operand2> as you are used to, operations are entered in postfix form with the two operands first and the operator last.

For example, the operation “ 1 + 2” would be entered as “ 1 2 +”

and the operation “3´2 + 4´5” would be entered as: “3 2 ´ 4 5 ´ +”

This seems a bit strange, but once you get used to it, postfix notation is much superior to infix notation because  you do not need parentheses to override precedence.  For example “3´ (4+5)” can be entered in postfix notation as “3 4 5 + ´”.  (Try other examples yourself). 

The HP RPN page also explains other advantages of reverse polish notation.  However, another additional advantage of reverse polish notation is that the calculators are very easy to implement with a stack:

·         when the user enters a number, it is simply pushed on the stack

·         when the user enters an operation, then the right number of operands are popped from the stack, combined using the operator, and the result is pushed back on the stack.

In this part of the assignment you should write a class Calculator which implements a reverse polish notation calculator with 4 binary operators: +, -, ´, and ¸ .  The exact specifications for the Calculator classes are in the Calculator.java file.  In particular:

·          Calculators have two possible user interfaces:

-          GUICalculator.java: which provides a  GUI input window class for the calculator.  You can test this class using TestGUICalculator.java

-          TextCalculator.java: which provides a text input user interface for the calculator.  The code for this class is much easier to understand than the code for the GUICalculator, so it is recommended that you read this file to understand how the Calculator methods are used.  You can test this class using TestTextCalculator.java

        The calculator should work with both classes without modifying them.

·         Numbers can be entered as integers or floats, but they are all converted to Floats before they are given to the calculator to push on the stack.  It is assumed that the operators work on Floats and the results are Floats. 

·         Unary + and unary – are accepted by the calculators but they are considered part of a number and not expressed in postfix notation.  In the GUICalculator, they are entered in the number field as part of the number (for example -12.3 or +23.5).  In the TextCalculator they are intered in front of the number (see the source for how this works).

·         The calculator should check for the following errors and push the String “Error” on the stack instead of performing an operation when it encounters one of these situations:

-          A division by zero

-          Not enough operands for an operation

-          One of the operands is the String “error”.

·         When a new number is pushed onto the stack, and the top of the stack is “Error”, “Error” is popped off the stack before the number is pushed.

·         The calculator will include a reference to a VisibleStack of initialsize 20 that is used to make it work.  Viewers for the calculator stack are added using the addViewer method described in Calculator.java

·         In addition to entering numbers and operations, users of the calculator can also request that the whole stack be cleared or that the top entry on the stack be removed.  See Calculator.java for specifications for these two methods and TextCalculator.java to see how they are used.