【程序员面试金典】集合栈

一.题目描述
请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。用vector来模拟。
二.题目分析
其实这道题目的题意也不难看懂,主要考察的是对vector的操作的熟练掌握。主要的操作如下:
1).判断第一个元素是什仫?如果是1则执行push操作,如果是2则执行pop操作,如果都不是则按错误处理;
2).push操作:如果当前栈不满则直接插入到当前的vector中,否则就要清空当前栈再进行插入操作。值得注意的是在清空之前要先保存当前栈;
3).pop操作:当前栈不为空则直接从当前栈删除,如果当前栈不为空的话从上一个栈删除;
三.代码实现

class SetOfStacks {
public:
    vector<vector<int> > setOfStacks(vector<vector<int> > ope, int size) {
        // write code here
        vector<vector<int>> res;
        vector<int> tmp;
        for(int i=0;i<ope.size();i++)    //遍历所有的集合栈
            {
            switch(ope[i][0])
                {
                case 1:      //push操作
                    if(tmp.size() != size)   //当前栈不满
                        tmp.push_back(ope[i][1]);
                    else{   //栈满
                        res.push_back(tmp);
                        tmp.clear();
                        tmp.push_back(ope[i][1]);
                    }
                    break;
                case 2:      //pop操作
                    if(!tmp.empty())   //当前栈不为空
                        tmp.pop_back();
                    else if(!res.empty())   //当前栈为空则从上一个栈pop元素
                        {
                        tmp=res[res.size()-1];
                        tmp.pop_back();
                        res.pop_back();
                    }
                    break;
                default:
                    break;
            }
        }
        if(!tmp.empty()){ 
            res.push_back(tmp);
        }
        return res;
    }
};

在这里就分享结束了~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值