【13】集合栈

【题目】

请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector&ltvector&ltint>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][](C++为vector&ltvector&ltint>>),为完成所有操作后的SetOfStacks,顺序应为从下到上,默认初始的SetOfStacks为空。保证数据合法。

代码:

import java.util.*;

public class SetOfStacks {
    public ArrayList<ArrayList<Integer>> setOfStacks(int[][] ope, int size) {
        // write code here
        ArrayList<ArrayList<Integer>> list = new  ArrayList<ArrayList<Integer>>();

        //获取操作次数
        int len = ope.length;
        if(ope == null || len <=0 )
            return list;
        //定义第一个栈集合,用来存放数据(若这个栈集合满了,就新建一个集合再去存储元素)。大小为size
         ArrayList<Integer> tempList = new ArrayList<Integer>(size);
        list.add(tempList);   

        /**
        *ope二维数组,可能的数为: (1,x1),(0,x2),(1,x3),(1,x4),(0,x5),(1,x6)....
        * len 为二维数组的长度,也是操作的次数
        *                        *
        */
        for(int i = 0; i < len; i++){

            //ope[i][0]即为每个二维数组中的第一个数:如(1,x1)即为ope[0][0]
            //                                        (0,x2)即为ope[1][0]
            //若为1,则为push操作
            if(ope[i][0] == 1){
                //当前栈满,就新建一个栈集合用来存储数据,并把当前满的数据存储到集合中
                if(tempList.size() >= size){
                    tempList = new ArrayList<Integer>(size);
                    list.add(tempList);
                }
                //ope[i][1]即为每个二维数组中的第2个数,是要存储的数:如存储(1,x1)中的x1:即为ope[0][1]
                //                                    存储(0,x2)的x2即为ope[1][1]
                tempList.add(ope[i][1]);

            }
            //若为2,则为pop操作
           if(ope[i][0] == 2){
                if(tempList.size() > 0){
                    tempList.remove(tempList.size() - 1);
                }else{
                    list.remove(list.size() - 1);
                    tempList = list.get(list.size() - 1);
                    tempList.remove(tempList.size() - 1);
                }

            }

        }

       return list; 

    }
}
时间: 2024-08-29 10:51:26

【13】集合栈的相关文章

13 集合

本章将讲述如何利用 java 类库帮助我们实现传统的数据结构. 将集合的接口与实现分离 队列接口 队列接口指出可以在队列的尾部添加元素 进队, 在队列头部删除元素 出队, 并且可以查找队列中元素的个数. 当需要搜集对象, 并按照"先进先出"的规则检索对象时就应该使用队列. 队列的最小形式, 类似: interface Queue<T> { void add(E element); E remove(); int size(); } 队列通常有两种实现方式, 一种是循环数组,

算法入门经典-第五章 例题 5-5 集合栈计算机

The SetStack Computer Time limit: 3.000 seconds 题目是这样的: 有一个专门为了集合运算而设计的"集合栈"计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集"{}"入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入栈INTERSECT:出栈两个集合,然后把二者的交集入栈ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈       每次操作后,输出

stack 集合栈计算机 (摘)

有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入栈INTERSECT:出栈两个集合,然后把二者的交集入栈ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈       每次操作后,输出栈顶集合的大小(即元素个数).例如栈顶元素是A={ {}, {{}} }, 下一个元素是B={ {}, {{{}}} },则:UNION操作将

UVa - 12096 集合栈计算机(STL)

[题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入栈,并输出并集的sizeINTERSECT:出栈两个集合,然后把二者的交集入栈,并输出交集的sizeADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈,并输出结果的size       每次操作后,输出栈顶集合的大小(即元素个数).例如栈顶元素是A={ {}, {{}

集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096)

集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096) 对于集合的集合,很难直接表示,因此,为方便起见,为每个不同的集合分配一个不同的ID,每个集合都可以表示成所含集合的ID集合,一个集合就可以表示为一个set 我的理解: {}:1 {{}} 2 栈中的都是集合,所以也是int类型的 实际进行操作的过程中,可以用map将每种集合和对应的ID关联起来,这样做既可以完成查找ID的任务,还可以同时判定是否出现了新的集合. 用vector作

2017年11月4日 vs类和结构的区别&amp;哈希表&amp;队列集合&amp;栈集合&amp;函数

类和结构的区别 类: 类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存 类有构造和析构函数 类可以继承和被继承 结构: 结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象. 结构没有构造函数,但可以添加.结构没有析构函数 结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口 //哈希表 //不规定长度 不规定类型 不规定建类型 //Hashtable j = new Hashtable(); //

【c#基础】集合--栈Stack 链表 LinkList 有序列表SortedList 字典

栈:是一个后进先出(LIFO)的容器 栈 push()方法在栈中添加元素,用Pop()方法获取最近添加的元素. 于Queue<T>类相似,Stack<T>类实现IEnumerable<T>和ICollection接口 Count   返回栈中的元素个数 Push    在栈顶添加一个元素 Pop 从站定删除一个元素,并返回该元素,如果栈是空的,就抛出InvalidOperationException异常 Peek    返回栈顶的元素,但不删除它 Contains 确定

13.1-全栈Java笔记:打飞机游戏实战项目|AWT技术|MyGameFrame

简介和项目目标 通过游戏项目学习整个Java基础知识体系,我们做了精心的设计,让每一章知识都能获得应用. 比如:多线程用来实现动画效果.容器实现对于多发炮弹的存取和处理.常用类等等的应用. 寓教于乐,让大家迅速入门,更希望通过喜闻乐见的小游戏,让大家爱上编程,爱上"程序员". 老鸟建议 很多朋友会疑惑:"游戏项目,又不能拿到企业面试中,为什么要讲?" 这是一种太过于功利的想法.就像,我们说:"今天吃个馒头,又不是长高,为什么要吃呢?" 游戏项目的

13.3-全栈Java笔记:打飞机游戏实战项目|PaintThread|launchFrame

多线程和内部类实现动画效果 1)增加绘制窗口的线程类 前三个版本,我们步步为营,每个小版本都有功能的突破.但是,目前为止我们的窗口仍然是静态的,并没有像真正的游戏窗口那样"各种动.各种炫".本节我们结合多线程实现动画效果. 我们在MyGameFrame类中定义"重画窗口线程PaintThread类",为了方便使用MyGameFrame类的属性和方法,我们将PaintThread定义成内部类. [示例1]MyGameFrame类:增加PaintThread内部类 pu