堆盘子 · 6 月更文挑战

233 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

一、题目描述:

堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。

当某个栈为空时,应当删除该栈。当栈中没有元素或不存在该栈时,pop,popAt 应返回 -1.

示例1:

输入: ["StackOfPlates", "push", "push", "popAt", "pop", "pop"] [[1], [1], [2], [1], [], []] 输出: [null, null, null, 2, 1, -1] 示例2:

输入: ["StackOfPlates", "push", "push", "push", "popAt", "popAt", "popAt"] [[2], [1], [2], [3], [0], [0], [0]] 输出: [null, null, null, null, 2, 1, 3]

来源:力扣(LeetCode) 链接:leetcode.cn/problems/st… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这道题的意思就是容器里面的元素为栈,栈的容量已经告诉,我们每次往栈里面添加元素,如果当前栈容量满了,然后又新加一个栈进去,实现扩容 那我们很容易想到用数组,数组的元素里面元素为栈,但是这个数组可以实现扩容和移除操作,不能是定长数组,那么在Java中很容易想到用List,维护一个数组来存放多个栈,模拟行为编写代码即可

三、AC 代码:

class StackOfPlates {
​
    private List<Stack<Integer>> list;
    private int cap;
​
    public StackOfPlates(int cap) {
        this.cap = cap;
        this.list = new ArrayList<Stack<Integer>>();
    }
    
    public void push(int val) {
      
        if (cap <= 0) {
            return;
        }
       
        if (list.isEmpty()) {
            list.add(new Stack<Integer>());
        }
       
        if (list.get(list.size() - 1).size() >= cap) {
            list.add(new Stack<Integer>());
        }
        
        Stack<Integer> stack = list.get(list.size() - 1);
        stack.push(val);
    }
    
    public int pop() {
       
        if (list.isEmpty()) {
            return -1;
        }
      
        Stack<Integer> stack = list.get(list.size() - 1);
        int val = stack.pop();
​
        if (stack.isEmpty()) {
            list.remove(list.size() - 1);
        }
        return val;
    }
    
    public int popAt(int index) {
       
        if(list.size() <= 0 || index > list.size() - 1) {
            return  -1;
        }
      
        Stack<Integer> stack = list.get(index);
        Integer pop = stack.pop();
   
        if(stack.isEmpty()) {
            this.list.remove(index);
        }
        return pop;
    }
}
​
​
​

四、总结:

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助,期待您找到心意的工作和满意的offer

期待下次再见~

\