面试14之请实现一种数据结构SetOfStacks

来源:互联网 发布:java两年经验工资多少 编辑:程序博客网 时间:2024/05/17 21:47
题目描述
请实现一种数据结构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;}



0 0