CC14:集合栈

题目

请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector<vector>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。
请返回一个int[],为完成所有操作后的SetOfStacks,顺序应为从下到上,默认初始的SetOfStacks为空。保证数据合法。

解法

这道题表述的不是特别清楚,举个例子:

1 2 1 3 1 4
2 2 1 5 2 4-------->表示的意思依次是:插入2、插入3、插入4、消除4(栈顶元素)、插入5、消除5(栈顶元素)、插入6、插入7、消除7
1 6 1 7 2 0

所以我们只需要依次判断数组元素,如果是1的话后面跟着的就是要插入的数字,如果是2的话就将之前插入的数字排除。而这里还涉及到了栈的size问题,由于返回类型为vector<vector<int>>,我们实际上可以利用一个vector类型(vec)来模拟栈。当vec的大小为size的时候就将vec存入到vector<vector>类型中,还有一点要注意的就是可能"出栈"的时候vec是没有元素的,此时我们就需要从结果vector<vector>中返回一个vec重新进行排除。
整个程序的逻辑还是非常清楚的,流程化思维就可以解决这个问题,AC代码如下:

class SetOfStacks {
public:
    vector<vector<int> > setOfStacks(vector<vector<int> > ope, int size) {
        // write code here
        vector<vector<int> > res;
        if(ope.size()==0)
            return res;
        vector<int> vec;
       for(int i=0;i<ope.size();i++)
       {
           if(ope[i][0]==1)
           {
               vec.push_back(ope[i][1]);
               if(vec.size()==size)
               {
                   res.push_back(vec);
                   vec.clear();
               }
           }
            else{
                if(vec.size()==0)
                {
                    vec=res.back();
                    res.pop_back();
                }
                vec.pop_back();
            }   
       }
        if(!vec.empty())
            res.push_back(vec);
        
        return res;
    }
};
posted @ 2018-07-22 10:10  MrYun  阅读(125)  评论(0编辑  收藏  举报