题目
思路分析
超级讨厌设计题,可能因为我不会设计,看到这个题目就好像听到设计老哥给我下需求:)脸上笑嘻嘻,心里:这啥玩意?这怎么做?能不能说人话?
回到这道题。它的需求其实就是实现多栈。第一个StackOfPlates就是设定没每个栈的最大存储数据个数。pop是弹出最后一个栈的值,popAt是弹出指定下标栈的值。最坑的就是这个push,它的含义竟然是将数据push到最后一个栈(如果该栈满了,则新开一个栈)。最开始半天没过,就是因为把push理解为找到没满的栈就push进去!而且题干里根本没看出这层意思!
代码
class StackOfPlates {
public:
int size;
int stackNum;
vector<vector<int>> stack;
StackOfPlates(int cap) {
this->size = cap;
this->stackNum = 0;
}
void push(int val) {
if (this->size == 0) {
return;
}
if (this->stackNum == 0) {
this->stackNum++;
stack.resize(1);
}
if (stack[this->stackNum - 1].size() < this->size) {
stack[this->stackNum - 1].push_back(val);
return;
}
this->stackNum++;
stack.resize(this->stackNum);
stack[this->stackNum - 1].push_back(val);
return;
}
int pop() {
if (this->stackNum == 0 || this->size == 0) {
return -1;
}
int res = stack[this->stackNum - 1].back();
stack[this->stackNum - 1].pop_back();
if (stack[this->stackNum - 1].size() == 0) {
stack.erase(stack.begin() + this->stackNum - 1);
this->stackNum--;
}
return res;
}
int popAt(int index) {
if (index >= this->stackNum || this->size == 0) {
return -1;
}
int res = stack[index].back();
stack[index].pop_back();
if (stack[index].size() == 0) {
stack.erase(stack.begin() + index);
this->stackNum--;
}
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);
*/