public class CompStack1> extends CompStack { private int lastIncreasing = 1; public void push(A n) { checkInvariant(); ((Object[])a)[tos]=n; tos++; if (tos>1 && lastIncreasing>=tos-1) if (((A)((Object[])a)[tos-2]).compareTo(n)<0) lastIncreasing = tos; else lastIncreasing = tos-1; checkInvariant(); } public A pop() { checkInvariant(); tos--; checkInvariant(); return (A)(((Object[])a)[tos]); } public boolean isIncreasing() { boolean r = lastIncreasing>=tos; assert r == super.isIncreasing() : "lastincreasing="+lastIncreasing+" tos="+tos; return r; } // Invariante: // (forall i=1..min(tos,lastIncreasing)-1: a[i-1]=tos || a[lastincreasing-1]>=a[lastIncreasing]) private void checkInvariant() { for (int i=1; i=tos || ((A)((Object[])a)[lastIncreasing-1]).compareTo(((A)((Object[])a)[lastIncreasing]))>=0; } public void debug() { System.out.println("debug: "+this+" "+isIncreasingSlow()); System.out.println(" tos = "+tos); System.out.println(" lastIncreasing = "+lastIncreasing); } }