package array;
import java.util.NoSuchElementException;
// une pile réalisée à l'aide d'un tableau redimensionnable
public class Stack implements intf.Stack {
private ResizableArray elts;
public Stack() {
this.elts = new ResizableArray(0);
}
public boolean isEmpty() {
return this.elts.size() == 0;
}
public int size() {
return this.elts.size();
}
public void clear() {
this.elts.setSize(0);
}
public void push(int x) {
int n = this.elts.size();
this.elts.setSize(n + 1);
this.elts.set(n, x);
}
public int pop() {
int n = this.elts.size();
if (n == 0)
throw new NoSuchElementException();
int e = this.elts.get(n - 1);
this.elts.setSize(n - 1);
return e;
}
public int top() {
int n = this.elts.size();
if (n == 0)
throw new NoSuchElementException();
return this.elts.get(n - 1);
}
public void swap() {
int n = this.elts.size();
if (n <= 1) throw new IllegalArgumentException();
int tmp = this.elts.get(n - 1);
this.elts.set(n - 1, this.elts.get(n - 2));
this.elts.set(n - 2, tmp);
}
// uniquement pour débugger
@Override
public String toString() {
return this.elts.toString();
}
}
class TestStack {
static void swap(Stack s) {
if (s.size() <= 1) throw new IllegalArgumentException();
int x = s.pop();
int y = s.pop();
s.push(x);
s.push(y);
}
public static void main(String[] args) {
Stack s = new Stack();
assert (s.isEmpty());
s.push(1);
assert (!s.isEmpty());
s.push(2);
assert (s.top() == 2);
s.push(3);
assert (s.top() == 3);
assert (s.pop() == 3);
assert (s.top() == 2);
assert (s.pop() == 2);
assert (s.top() == 1);
assert (s.pop() == 1);
assert (s.isEmpty());
s.push(1);
try { s.swap(); assert false; } catch (IllegalArgumentException e) { };
s.push(2);
s.swap();
assert (s.top() == 1);
s.pop();
assert (s.top() == 2);
s.clear();
assert s.size() == 0;
s.push(1);
try { swap(s); assert false; } catch (IllegalArgumentException e) { };
s.push(2);
swap(s);
assert (s.top() == 1);
s.pop();
assert (s.top() == 2);
System.out.println("TestStack OK");
}
}