数据结构和算法分析数据结构与算法

Leetcode-面试题 03.03 堆盘子

2021-10-12  本文已影响0人  itbird01

面试题 03.03. 堆盘子

解题思路

1.分析题意,有多个栈用于储存数据,栈扩充的前提是当前栈已存储满
2.用LinkedList来存储多个栈,可以进行末尾栈的直接操作
3.push操作,如果list末尾栈size>=cap,则新建栈放入list末尾,存储x;否则直接用list末尾栈存储x
4.pop操作,直接返回List末尾栈的,pop操作元素,并且此时需要判断,pop之后,如果当前list末尾栈为空,则从list移除当前栈
5.popAt操作,从list中选择相应的栈,进行pop操作,此时需要判断,pop之后的栈大小,如果当前栈为空,则从list移除当前栈
6.当栈中没有元素或不存在该栈时,pop,popAt 应返回 -1
7.stackcap 需要考虑为0时,即栈中无法存储元素

解题遇到的问题

1.当栈中没有元素或不存在该栈时,pop,popAt 应返回 -1
2.stackcap 需要考虑为0时,即栈中无法存储元素
3.push与pop时,需要考虑list.size为0、栈为空等多种特殊情况

后续需要总结学习的知识点

1.不使用LinkedList,是否有其他解法?

##解法
import java.util.LinkedList;
import java.util.Stack;

class StackOfPlates {
    LinkedList<Stack<Integer>> stacklist = new LinkedList<Stack<Integer>>();
    int stackMaxIndex = 0;

    public StackOfPlates(int cap) {
        stackMaxIndex = cap;
        stacklist.add(new Stack<Integer>());
    }

    public void push(int val) {
        if (stackMaxIndex == 0) {
            return;
        }
        if (stacklist.size() == 0 || stacklist.getLast() == null
                || stacklist.getLast().size() >= stackMaxIndex) {
            stacklist.add(new Stack<Integer>());
        }
        stacklist.getLast().push(val);
    }

    public int pop() {
        if (stacklist.size() == 0 || stacklist.getLast() == null
                || stacklist.getLast().isEmpty() || stackMaxIndex == 0) {
            return -1;
        }
        int result = stacklist.getLast().pop();
        if (stacklist.getLast().isEmpty()) {
            stacklist.removeLast();
        }
        return result;
    }

    public int popAt(int index) {
        if (stacklist.size() <= index || stackMaxIndex == 0) {
            return -1;
        }
        int result = stacklist.get(index).pop();
        if (stacklist.get(index).isEmpty()) {
            stacklist.remove(index);
        }
        return result;
    }
}
上一篇下一篇

猜你喜欢

热点阅读