原书中描述设想有一堆盘子,堆太高可能会倒下来;在现实生活中,盘子堆到一定高度时重新堆另外一堆盘子。请实现一种数据结构SetOfStacks,模拟这种行为。
为了方便检测,设置多行两列的操作数组op[][];每行第一个数代表操作,若为1,push进栈、第二个数为进栈数据;若为2,pop出栈;size表示每个栈最大容量,超过栈的容量则申请新栈,最后返回所有栈
Java代码参考
import java.util.ArrayList;
import java.util.Stack;
public class _03SetOfStacks {
public static void main(String[] args) {
int[][] op = {//模拟进栈1,2,3,4;出栈
{1, 1},
{1, 2},
{1, 3},
{1, 4},
{2, 0}
};
int size = 2;//每个栈最大容量2
ArrayList<Stack<Integer>> res = setOfStacks(op, size);
System.out.println(res.toString());
}
private static ArrayList<Stack<Integer>> setOfStacks(int[][] op, int size) {
ArrayList<Stack<Integer>> ans = new ArrayList<>();
Stack<Integer> current = new Stack<>();//当前操作栈
for(int i = 0; i < op.length; i++) {
int operate = op[i][0];//操作数1-进栈;2-出栈
int data = op[i][1];//进栈数据
if(operate == 1) {//进栈
if(current.size() == size) {//栈满
ans.add(current);
current = new Stack<Integer>();
}
current.push(data);
}else if(operate == 2) {
if(current.size() <= 0) {
current = ans.get(ans.size() - 1);
ans.remove(ans.size());
}else {
current.pop();
}
}
if(i == op.length - 1&¤t.size() < size)//最后一个未满栈的添加
ans.add(current);
}
return ans;
}
}
网友评论