Question 1: array-based stacks
One easy way to implement a stack is as an array,
filling the array from positions 0..N-1 as new elements
are pushed. A 'topOfStack' index tracks which position
in the array currently contains the top element, e.g.
// default size of stack array
const int DefaultSize = 100;
// a stack of ints
class stack {
protected:
int *stk; // array of stack elements
int size; // number of elements stack can hold
int topOfStack; // current position of top element
public:
// dynamically allocate the array
// and initialize topOfStack, size
Stack(int size = DefaultSize);
~Stack(); // deallocate the array
bool push(int i); // push item i onto top of stack
bool pop(int &i); // pop top item off into i
bool isfull(); // returns true iff the stack is full
// (no space left in array for elements)
};
Task: implement the constructor and push methods.
Question 2: biggest value in a tree
Suppose we have a binary tree that is not
a binary search tree - i.e. any value can appear
anywhere in the tree.
The definition of a tree node is given below,
along with the specification for a recursive find
function that searches a subtree to find a specific value.
Task: implement the find function.
// the definition of a tree node is as follows:
// struct tnode {
// int value;
// tnode *left, *right;
//};
// find searches the subtree rooted at t for the
// indicated value, returning true if the subtree
// contains the value and false otherwise
bool find(tnode *t, int val)