面试题 03.03. 堆盘子(含vector多个知识点)

在这里插入图片描述
解题思路

用vector嵌套stack模拟题意。
需要特别注意的就是cap为0的情况,此时无法存任何数据,所有函数直接返回结果

Warnning:

int popAt(int index) {
        if(capacity==0||stk[index].empty() || index >= stk.size())return -1;

这一段的逻辑条件看似没问题,实际上先后顺序错了,index>=那个条件只能放在第二个,不然会出问题,当index>=stk.size()时,stk[index]不存在!
就会报这样的错:
在这里插入图片描述Line 1038: Char 34: runtime error: applying non-zero offset 80 to null pointer (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/…/lib/gcc/x86_64-linux-gnu/9/…/…/…/…/include/c++/9/bits/stl_vector.h:1043:34

知识点:
1.emplace_back可以通过参数直接本地构建对象。 push_back的参数需要一个已经存在的对象,如果不存在,需要首先创建一个
2.back(),ease()等函数

class StackOfPlates {
private:
    int capacity;
    vector<stack<int>>stk;
public:
    StackOfPlates(int cap) {
        capacity=cap;
    }
    
    void push(int val) {
        if(capacity==0)return;
        if(stk.empty()||stk.back().size()==capacity)stk.emplace_back(stack<int>());//emplace_back可以通过参数直接本地构建对象。 push_back的参数需要一个已经存在的对象,如果不存在,需要首先创建一个
        stk.back().push(val);//back()容器中的最后一个元素
    }
    
    int pop() {
        if(capacity==0||stk.empty())return -1;
        int res=stk.back().top();
        stk.back().pop();
        if(stk.back().empty())stk.pop_back();
        return res;
    }
    
    int popAt(int index) {
        if(capacity==0|| index >= stk.size()||stk[index].empty())return -1;
        int res=stk[index].top();
        stk[index].pop();
        if(stk[index].empty())stk.erase(stk.begin()+index);//erase是删除函数,erase英文意思就是删除。。
        return res;
    }
};

/**
 * Your StackOfPlates object will be instantiated and called as such:
 * StackOfPlates* obj = new StackOfPlates(cap);
 * obj->push(val);
 * int param_2 = obj->pop();
 * int param_3 = obj->popAt(index);
 */

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值