持续创作,加速成长!这是我参与「掘金日新计划 · 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
期待下次再见~
\