题目:请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector<vector<int>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][](C++为vector<vector<int>>),为完成所有操作后的SetOfStacks,顺序应为从下到上,默认初始的SetOfStacks为空。保证数据合法。
/*
* 1.添加元素时,确认stackSet的当前活动栈是否满 > 满 , 开辟新栈 > 不满,放入元素
* 2.弹出元素时,确认stackSet当前活动栈是否为空
* >空,则看当前栈是否为第一个栈,若是,则无法弹出,打印empty;若否,则删除当前栈,活动栈仍为栈的当前大小 >不空,则弹出最后的元素
*/
public ArrayList<ArrayList<Integer>> setOfStacks1(int[][] ope, int size) {
// write code here
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> curArray = new ArrayList<Integer>(size);
list.add(curArray);
for (int i = 0; i < ope.length; i++) {
switch (ope[i][0]) {
// 1:push
case 1:
// 当前数组未满
if (curArray.size() != size) {
curArray.add(ope[i][1]);
} else {
curArray = new ArrayList<Integer>(size);
list.add(curArray);
curArray.add(ope[i][1]);
}
break;
// 2:pop
case 2:
// int[][] ope = new int[][] { { 1, 1 }, { 1, -1 }, { 1, 0 }, { 1, 3 },
//{ 1, 4 }, { 2, 0 }, { 2, -1 } };list={{1,-1}{0,3},{4}}
// 当前数组不为空 移除4
// curArray为空,但list不为空,同时也要移除list的最后一个元素list.size()-1,
// 移除之后list={{1,-1}{0,3}},将list的最后一个元素list.size()-1即{0,3}赋给curArray
// 然后curArray移除最后一个元素curArray.size()-1,即3.最终删除了3
if (list.size() <= 1 && curArray.size() == 0) {
return list;
} else {
if (curArray.size() != 0) {
curArray.remove(curArray.size() - 1);
} else {
list.remove(list.size() - 1);// 仅仅当前栈空,但集合有数据,换集合中下一个栈弹出
curArray = list.get(list.size() - 1);
curArray.remove(curArray.size() - 1);
}
}
break;
}
}
return list;
}
//上述方法,先把小栈加入到大栈里面,(可以说成,在大栈的最后一个元素是小栈的一个备份),在删除小栈数据的同时,大栈里面的数据也会相应地删除,如果小栈size为空。则大栈里最后一个元素size也为0,我们要先把大栈里面最后一个元素删除,然后在把大栈的最后一个元素赋给小栈,再删除小栈的最后一个元素。
同样的方法,但是不一样的代码。
//下面的方法,只有小栈满时,才会追加到大栈里。然后,如果小栈空时,把大栈里面的最后一个数据移除,赋给小栈。 所以在最后,要判断小栈是否为空,不为空,则加到大栈里。
//第一,一般大家都是判断达到size大小把小栈加到大的,但是,如果最后一个小栈大小没有达到size,而此时数组已经遍历完了,那么这个小栈就加入不了,所以在最后要对小栈进行判定,如果大小不为0,则要加入大栈。
//第二,如果小栈弹完了,此时又出现弹出操作,那么此时应该先从大栈中弹出一个赋值给小栈,然后再从这个小栈中弹出。
public ArrayList<ArrayList<Integer>> setOfStacks3(int[][] ope, int size) {
ArrayList<ArrayList<Integer>> outterList = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> innerList = new ArrayList<Integer>();
if (ope == null || ope.length == 0)
return outterList;
for (int i = 0; i < ope.length; i++) {
if (ope[i][0] == 1) {
if (innerList.size() == size) {
outterList.add(innerList);
innerList = new ArrayList<Integer>();
}
innerList.add(ope[i][1]);
}
else if (ope[i][0] == 2) {
if (innerList.size() <= 0) {
innerList = outterList.get(outterList.size() - 1);
outterList.remove(outterList.size() - 1);
}
innerList.remove(innerList.size() - 1);
}
}
if (innerList.size()!=0)
outterList.add(innerList);
return outterList;
}