package stack;
public class StackImpl implements Stack {
/*@ spec_public */ private int maxSize = 50;
/*@ spec_public */ private int[] internalStack;
/*@ spec_public */ private int stackCounter; //@ in count;
//@ public represents count = stackCounter;
//@ public invariant stackCounter <= internalStack.length;
//@ public invariant internalStack.length >= maxSize;
//@ ensures count == 0;
//@ ensures stackCounter == 0;
//@ ensures count() == 0;
@SuppressWarnings("unchecked")
public StackImpl() {
internalStack = new int[maxSize];
stackCounter = 0;
}
//@ ensures \result == stackCounter;
//@ pure
//@ helper
public int count() {
return stackCounter;
}
//@ requires 1 <= i && i <= count();
//@ ensures \result == internalStack[i-1];
//@ pure
public int itemAt(int i) {
return internalStack[i-1];
}
//@ pure
public boolean isEmpty() {
return stackCounter == 0;
}
public boolean push(int item) {
if(stackCounter + 1 > maxSize) return false;
internalStack[stackCounter] = item;
stackCounter++;
return true;
}
public int top() {
return internalStack[stackCounter-1];
}
public boolean remove() {
if(stackCounter == 0) return false;
stackCounter--;
return true;
}
public static void main(String[] args) {
Stack s = new StackImpl();
//@ assert s.count == 0;
boolean b1 = s.push(2);
boolean b2 = s.push(2);
boolean b3 = s.push(2);
if (!(b1 && b2 && b3)) return;
System.out.println(s.itemAt(1));
System.out.println(s.itemAt(2));
System.out.println(s.itemAt(3));
}
public static void main1(String[] args) {
StackImpl s = new StackImpl();
//@ assert s.count == 0;
boolean b1 = s.push(2);
boolean b2 = s.push(2);
boolean b3 = s.push(2);
if (!(b1 && b2 && b3)) return;
System.out.println(s.itemAt(1));
System.out.println(s.itemAt(2));
System.out.println(s.itemAt(3));
}
}