美文网首页
程序员面试金典_SetOfStacks

程序员面试金典_SetOfStacks

作者: 掌灬纹 | 来源:发表于2019-05-02 11:37 被阅读0次

    原书中描述设想有一堆盘子,堆太高可能会倒下来;在现实生活中,盘子堆到一定高度时重新堆另外一堆盘子。请实现一种数据结构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&&current.size() < size)//最后一个未满栈的添加
                    ans.add(current);
            }
            
            return ans;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:程序员面试金典_SetOfStacks

          本文链接:https://www.haomeiwen.com/subject/tacnnqtx.html