import java.util.ArrayList;
import java.util.Stack;
/**
* Created by rgl on 2018/10/18.
设想有一堆盘子,堆太高可能会倒下来,因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为,SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样。)
*/
public class SetOfStacks<E> {
//用于记录所维护的所有Stack
private ArrayList<Stack<E>> list = new ArrayList<>();
//记录最新的Stack,待存入和取值的Stack
private Stack<E> currentStack;
//每个栈的最大容量
private static final int MAX_CAP = 100;
public SetOfStacks() {
Stack<E> stack = new Stack<>();
list.add(stack);
currentStack = stack;
}
public void push(E value) {
if (currentStack.size() >= MAX_CAP) {
Stack<E> newStack = new Stack<>();
newStack.push(value);
list.add(newStack);
currentStack = newStack;
} else {
currentStack.push(value);
}
}
public E pop() {
E value = currentStack.pop();
;
if (currentStack.size() == 0 && list.size() > 1) {
list.remove(currentStack);
currentStack = list.get(list.size() - 1);
}
return value;
}
public E peek() {
if (isEmpty()) {
return null;
}
return currentStack.peek();
}
public boolean isEmpty() {
return list.size() == 1 && currentStack.size() == 0;
}
//@Test
public static void main(String[] args) {
SetOfStacks<Integer> setOfStacks = new SetOfStacks<>();
for (int i = 0; i < 250; i++) {
setOfStacks.push(i);
}
System.out.println(setOfStacks.peek());
System.out.println(setOfStacks.pop());
}
}