1.トピック
ヒープ一品。プレートの山を想像し、高すぎるスタックが落ちることがあります。したがって、現実の生活、一定の高さにプレートヒープに、私たちは料理の別の山になります。
データ構造を実現してくださいSetOfStacks
、この動作をシミュレートします。SetOfStacks
これは、複数のスタック、および新しいフロントスタックスタック塗りつぶしで構成されなければなりません。
加えて、SetOfStacks.push()
そしてSetOfStacks.pop()
、それは通常のスタック操作方法と同じでなければならない()戻り値を(ポップ、と言うことであり、場合べきとき、同じスタックとつのみ)。
高度:実施popAt(int index)
指定されたサブスタック行うポップ操作に応じて、方法。
スタックが空である場合には、スタックが削除されるべきです。要素またはスタックせずに、スタックの不在た場合は、ポップ、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]
2.問題解決
- ベクトル記憶スタックと
class StackOfPlates {
vector<stack<int>> vs;
int n;
int val;
public:
StackOfPlates(int cap) {
n = cap;
}
void push(int val) {
if(n == 0)
return;
if(vs.empty() || vs.back().size()==n)
{ //没有位置,新开一个栈
stack<int> s;
vs.push_back(s);
vs.back().push(val);
}
else
vs.back().push(val);
}
int pop() {
if(!vs.empty())
{
val = vs.back().top();
vs.back().pop();
if(vs.back().empty())
vs.pop_back();
return val;
}
return -1;
}
int popAt(int index) {
if(index<0 || index >= vs.size())
return -1;
val = vs[index].top();
vs[index].pop();
if(vs[index].empty())
vs.erase(vs.begin()+index);
return val;
}
};