面试题 03.03:堆盘子

简介: 面试题 03.03:堆盘子

题目

题目链接

堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构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]

解题

方法一:模拟

参考链接

用一个vector来动态地存储stack

capacity来记录容量

在push的时候,如果出现空的或者满的,就创建一个新的栈,再在里面放元素

在pop的时候,如果栈空了,就清理掉。(因此,结合push和pop每个栈都不可能是空的).

class StackOfPlates {
public:
    int capacity;
    vector<stack<int>> stks;
    StackOfPlates(int cap) {
        capacity=cap;
    }
    void push(int val) {
        if(capacity==0) return;
        if(stks.empty()||stks.back().size()==capacity){
            stks.push_back(stack<int>());
        }
        stks.back().push(val);
    }
    int pop() {
        return popAt(stks.size()-1);
    }
    int popAt(int index) {
        if(index>=stks.size()) return -1;//如果capacity为空,那么stks.size()==0,无论index怎么取都不行
        int res=stks[index].top();
        stks[index].pop();
        if(stks[index].empty()){
            stks.erase(stks.begin()+index);
        }
        return res;
    }
};
相关文章
|
6月前
|
存储 机器学习/深度学习 算法
数据结构与算法:堆
朋友们大家好啊,本篇文章来到堆的内容,堆是一种完全二叉树,再介绍堆之前,我们首先对树进行讲解
数据结构与算法:堆
|
5月前
|
存储 算法
面试必知必会|理解堆和堆排序
面试必知必会|理解堆和堆排序
|
6月前
|
算法 PHP
堆——“数据结构与算法”
堆——“数据结构与算法”
|
6月前
面试题 08.13:堆箱子
面试题 08.13:堆箱子
54 0
|
11月前
|
存储 C语言
堆与堆排序操作详解
堆与堆排序操作详解
|
存储 算法 C++
对顶堆算法
对顶堆算法
133 1
对顶堆算法
|
存储 算法
【数据结构与算法】堆的实现
第二步,将数据插入堆后,发现堆的性质发生改变,原来是一个小堆,每个父节点都小于子结点的,但由于插入的数据,导致这一性质改变,所以我们需要将该新结点往上调整,顺着它的双亲走就可以,因为只有它这个地方发生了改变。
89 0
|
算法
【堆的应用】堆排序
向上调整建堆通常使用在堆中一开始没有数据,后来数据才进堆中,需要不断的往堆中插入,这样使用向上调整建堆很方便。因为数据只有在堆上面,下面也没有数据,使用向下调整很困难,而且低效。
130 0
堆 最小堆 最大堆 堆排序(小到大,大到小)
堆 最小堆 最大堆 堆排序(小到大,大到小)
堆 最小堆 最大堆 堆排序(小到大,大到小)