解题思路
用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);
*/