集合栈

题目:请实现一种数据结构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;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值