题目描述
请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector<vector<int>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][](C++为vector<vector<int>>),为完成所有操作后的SetOfStacks,顺序应为从下到上,默认初始的SetOfStacks为空。保证数据合法。
思路:插入删除的时候都在最后一个栈,当删除和插入的时候一定要检查是否满了或空了,
#include<iostream>
using namespace std;
#include<vector>
//思路:我们用二维数组来模拟集合栈, ope是一个二维数组,如果每一行的第一个元素是0,表示这一行除了第一个元素都要插入到这个集合栈中去,如果这一行第一个元素是1,后面的元素我们不关心,并且删除集合栈中的最后一个元素,
//但是要注意如果集合栈最后一个栈如果只有一个元素,得把这个栈从集合栈中删除。
vector<vector<int> > setofstacks(vector<vector<int> > ope,int size) //size表示每一个集合栈的大小,也就是vector<int> 的容量。
{
vector<vector<int> > v;
vector<int> temp;
for(int i = 0; i < ope.size(); ++i) //
{
if(ope[i][0] == 1) //表示这要插入元素了。
{
if(!v.empty()&& v[v.size()-1].size() < size) //继续插入的时候应该检查上次插入的时候最后一个栈是否满了。
{
temp = v[v.size()-1]; //拿出最后一个栈。
v.pop_back();
}
for(int j = 1; j < ope[i].size(); ++j) //将这个数组每一行的元素读入。
{
temp.push_back(ope[i][j]);
if(temp.size() == size)
{
v.push_back(temp);
temp.clear(); //清空,防止对下一次有影响。
}
}
if(!temp.empty()) //如果最后temp中还有剩下元素,但是不够size大小时,这些元素也得插入到集合栈中去。
{
v.push_back(temp);
temp.clear(); //清空。
}
}
else //ope[i][0] == 2表示要删除最后一个元素了。
{
vector<int > ret = v[v.size()-1]; //最后一行。看最后一行删除后是不是为空,为空的话得将这一行删除。
v.pop_back(); //删除最后一行
ret.pop_back(); //删除最后一个元素
if(!ret.empty()) //最后一行删除最后一个元素不空
{
v.push_back(ret); //再将这行写回去。
}
}
}
return v;
}
void test()
{
vector<vector<int> > v; //用二维数组模拟集合栈。
vector<int > v1;
v1.push_back(1) ;//表示要插入元素到集合栈中。
for(int i = 3; i < 7; ++i)
{
v1.push_back(i);
}
v.push_back(v1);
v1.clear();
v1.push_back(1); //表示要插入元素到集合栈中。
for(int i = 10; i < 20; ++i)
{
v1.push_back(i);
}
v.push_back(v1);
v1.clear();
v1.push_back(2); //表示要从集合栈中删除最后一个元素。
v1.push_back(333);
v.push_back(v1);
vector<vector<int> > ret;
ret = setofstacks(v,3); //集合栈中每一个栈3个元素。
for(int i = 0; i < ret.size(); ++i)
{
for(int j = 0; j < ret[i].size(); ++j)
{
cout << ret[i][j] << " ";
}
cout <<endl;
}
}
int main()
{
test();
cout << "hello..." <<endl;
return 0;
}