标签:
题目:请实现一种数据结构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; }
标签:
原文地址:http://blog.csdn.net/qq_17034717/article/details/51364533