每日一题(8)


思路:
我们可以设计两个递归函数,第一个函数返回栈底元素并移除该元素得以让下一个递归函数进行压入操作
第一个函数示意图:

第二个函数调用:

#include<string>
#include<iostream>
#include<stack>
using namespace std;

//得到当前栈的栈底元素
int getAndRemoveLast(stack<int> &stack) {
    int result = stack.top();
    stack.pop();
    if (stack.empty()) {
        return result;
    }
    else {
        int last = getAndRemoveLast(stack);
        stack.push(result);
        return last;
    }
}
//反转栈的函数
void reverse(stack<int> &stack) {
    if (stack.empty()) {
        return;
    }
    int i = getAndRemoveLast(stack);//得到当前栈的栈底元素
    reverse(stack);//递归调用
    stack.push(i);
}
int main()
{
    stack<int> s;
    s.push(1);
    s.push(2);
    s.push(3);
    reverse(s);
    while (s.size()!=0)
    {
        cout << s.top() << endl;
        s.pop();
    }
    return 0;
}


思路:首先建立一个栈组A(定义为vector<vector<int>> A),存放长度达到size的栈。定义vector<int> vect

操作如下:

从i = 0 ~ ope.size() - 1遍历

1、对于压栈指令(即ope[i][0] = 1),首先判断A是否为空

1)如果A为空,那么考虑将数据压入vect

        1.如果vect长度已经达到size,那么先将vect压入A,然后清空vect里的元素,再将数据ope[i][1]压入vect;

        2.如果vect长度小于size,直接将vect压入A(此时不可以判断vect的长度是否到达size,即使到达size,也要确定下一个指令不是pop,才可以将vect压入A,以免压入之后,再从A[A.size() - 1]中弹出数据)。

2)如果A不为空,先判断A的顶栈是否是满的,即判断A[A.size() - 1]长度是不是达到size,如果没有达到size,则将数据压入A[A.size() -1];如果达到size,则对vect进行判断,如果vect长度小于size,直接压入vect,否则执行上一步的第一条。

2、对于出栈指令,首先判断vect是否为空

1)如果vect为空,则从A的顶栈中弹出顶元素,即执行A[a.size() - 1].pop_back(),弹出之后如果A[a.size() - 1]为空,则从A中弹出A[a.size() - 1],即执行A.pop_back;

2)如果vect不为空,则直接从vect中弹出元素,即执行vect.pop_back().

遍历结束之后,如果vect不为空,则将vect压入A,即A.push_back(vect)

返回A。

class SetOfStacks {
public:
    vector<vector<int> > setOfStacks(vector<vector<int> > ope, int size) {
        // write code here
        vector<int> vect;
        vector<vector<int>> A;
        int len = vect.size();
        for(int i = 0; i < ope.size(); i ++)
            {
            //压入操作时
            if(ope[i][0] == 1)
                {
                //判断A是否为空
                if(A.size() == 0)
                    {
                    //判断vect是否已满
                    if(vect.size() == size)
                        {
                        A.push_back(vect);
                        vect.clear();
                        vect.push_back(ope[i][1]);
                    }
                    else
                        vect.push_back(ope[i][1]);
                }
                else  //A不为空
                    {
                    //判断A的顶栈是否已满
                    if(A[A.size() - 1].size() < size)
                        A[A.size() - 1].push_back(ope[i][1]);
                    else
                        {
                        if(vect.size() == size)
                            {
                            A.push_back(vect);
                            vect.clear();
                            vect.push_back(ope[i][1]);
                        }
                        else
                            vect.push_back(ope[i][1]);
                    }
                }
            }
            else   //弹出操作
                {
                //判断vect是否为空
                if(vect.empty())   //为空
                    {
                    //弹出A顶栈的元素
                    A[A.size() - 1].pop_back();
                    //判断顶栈是否为空
                    if(A[A.size() - 1].empty())  //为空则弹出顶栈
                        A.pop_back();
                }
                else    //vect不为空
                    vect.pop_back();
            }
        }
        if(!vect.empty())
            A.push_back(vect);
        return A;
    }
};

猜你喜欢

转载自blog.csdn.net/sifanchao/article/details/81561899