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

题目描述
请实现一种数据结构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;
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值