面试题 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;
    }
};
相关文章
|
8月前
|
存储 消息中间件 Kubernetes
剑指offer常见题 - 链表问题(一)
剑指offer常见题 - 链表问题(一)
|
8月前
|
存储 机器学习/深度学习 算法
数据结构与算法:堆
朋友们大家好啊,本篇文章来到堆的内容,堆是一种完全二叉树,再介绍堆之前,我们首先对树进行讲解
数据结构与算法:堆
|
7月前
|
存储 算法
面试必知必会|理解堆和堆排序
面试必知必会|理解堆和堆排序
|
8月前
【一刷《剑指Offer》】面试题 7:用两个栈实现队列
【一刷《剑指Offer》】面试题 7:用两个栈实现队列
|
8月前
|
算法 PHP
堆——“数据结构与算法”
堆——“数据结构与算法”
|
8月前
面试题 08.13:堆箱子
面试题 08.13:堆箱子
66 0
|
8月前
|
存储 消息中间件 Kubernetes
剑指offer常见题 - 链表问题(二)
剑指offer常见题 - 链表问题(二)
|
8月前
剑指offer——链表
剑指offer——链表
26 0
|
8月前
|
存储
剑指Offer 面试题09. 用两个栈实现队列
剑指Offer 面试题09. 用两个栈实现队列
51 0
|
存储 算法
【数据结构与算法】堆的实现
第二步,将数据插入堆后,发现堆的性质发生改变,原来是一个小堆,每个父节点都小于子结点的,但由于插入的数据,导致这一性质改变,所以我们需要将该新结点往上调整,顺着它的双亲走就可以,因为只有它这个地方发生了改变。
96 0

热门文章

最新文章

下一篇
开通oss服务