Here are the classes that we wrote in the lecture and lab.
// A fixed-size stack of integers.
class Stack {
int[] a;
protected int count;
public Stack(int maxSize) {
a = new int[maxSize];
}
public virtual void push(int i) {
a[count] = i;
++count;
}
public virtual int pop() {
--count;
return a[count];
}
public bool isEmpty {
get {
return (count == 0);
}
}
}
// An AvgStack is like a Stack, but has an additional method avg() that
// returns the average of all stack values in O(1) time.
class AvgStack : Stack {
int sum;
public AvgStack(int maxSize) : base(maxSize) {
}
public override void push(int i) {
base.push(i);
sum += i;
}
public override int pop() {
int i = base.pop();
sum -= i;
return i;
}
public double avg() {
return (double) sum / count;
}
}class Node {
public int i;
public Node next;
public Node(int i, Node next) {
this.i = i; this.next = next;
}
}
// A stack of integers, implemented using a linked list.
class LinkedStack {
Node head;
public void push(int i) {
head = new Node(i, head);
}
public int pop() {
int i = head.i;
head = head.next;
return i;
}
public bool isEmpty {
get {
return (head == null);
}
}
}// A UniqueStack is like a LinkedStack, but ignores any attempt to push
// the same value that is at the top of the stack.
class UniqueStack : LinkedStack {
public override void push(int i) {
if (isEmpty || i != head.i)
base.push(i);
}
}class DynArray {
int[] a;
int count;
// Create a new DynArray with the given initial length.
// All elements will initially be set to val.
public DynArray(int length, int val) {
a = new int[Max(length, 10)]; // create array with at least 10 elements initially
count = length;
for (int i = 0 ; i < length ; ++i)
a[i] = val;
}
// Create a new DynArray with the given initial length. All elements will be 0.
public DynArray(int length) : this(length, 0) { }
// Create a new DynArray that is initially empty.
public DynArray() : this(0) { }
// Retrieve the value at the given index, which must be less than the current array length.
public int get(int i) => a[i];
// Set the value at the given index, which must be less than the current array length.
public void set(int i, int val) { a[i] = val; }
// Get or set the length of the array. When growing the array, all new elements will be 0.
public int length {
get => count;
set {
if (value <= a.Length) // growing or shrinking within array bounds
for (int i = count ; i < value ; ++i)
a[i] = 0;
else {
int[] b = new int[Max(value, 2 * a.Length)]; // double the array size at least
for (int i = 0 ; i < count ; ++i)
b[i] = a[i];
a = b;
}
count = value;
}
}
// Append a new element to the array, growing its length by 1.
public void add(int i) {
length = length + 1;
a[length - 1] = i;
}
}