Solution to 1486: String stack
See code at solutions/code/tutorialquestions/question1486
The StringStackArray class implementation is straightforward: see the sample solution.
The StringStackList class implementation is even more straightforward; perhaps so straightforward you may have
worried that you were missing something! Look at the sample solution. The only slightly tricky part is implementing pop()
so that the last element of the list is removed.
You will see in the sample solution that StringStackArray and StringStackList both implement
the StringStack interface. Notice that the interface methods are declared public. This is not actually
necessary, as they are implicitly public. However, it does no harm. The implementations of these methods in
StringStackArray and StringStackList must be declared public regardless.
See how simple the implementation of transferStacks in Demo.java is:
public static void transferStacks(StringStack dst, StringStack src) {
while(!src.isEmpty()) {
dst.push(src.pop());
}
}
Because we have a StringStack interface, we can write this method purely in terms of the interface
type, regardless of the classes that provide actual types for src and dst.
The power of this is illustrated in main, where we can write:
StringStack first = new StringStackArray();
StringStack second = new StringStackList();
...
transferStacks(second, first);
Polymorphism here allows us to treat a StringStackArray and a StringStackList uniformly
as objects of type StringStack when we call transferStacks. Note that it would also work if we wrote:
StringStackArray first = new StringStackArray();
StringStackList second = new StringStackList();
...
transferStacks(second, first);
In this case, the compiler upcasts first and second to StringStack when transferStacks is called.
Finally, if we want to change StringStackList to use a LinkedList instead of an ArrayList, we need only change:
elements = new ArrayList<String>();
to
elements = new LinkedList<String>();
in the constructor of StringStackList.