## L2-041 插松枝

题目链接：
https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId=1518582268930473984&page=1

L2的第一题一般都是考栈，本题也是一样的，但是我觉得今年的L2-1比之前的更难一些，要考虑的条件比较多，具体代码如下：

```cpp
#include<bits/stdc++.h>
using namespace std;
//总体来说，，本题还是相对复杂的
int main(){
    int N,M,K;
    cin>>N>>M>>K;
    deque<int> seq;
    for(int i=0;i<N;i++){
        int num; cin>>num;
        seq.push_back(num);
    }
    stack<int> box;
    vector<int> tree;
    //只要小盒子不为空，或者推送器不为空就应该继续
    while(!box.empty() || !seq.empty()){
        //我们需要找出结果数组的第一个数字，才能与后面的数字比较
        int front;
        if(box.empty()){
            front=seq.front();
            seq.pop_front();
        }
        else{
            front=box.top();
            box.pop();
        }
        tree.push_back(front);//先插入第一根松针再说
        bool finish=true;//我们用一个bool变量来记录
        while(finish){
            if(tree.size()==K){
                finish=false;//提前结束
                break;
            }
            int current;
            if(!box.empty() && box.top()<=front){
                current=box.top();
                box.pop();
            }
            else{
                if(seq.empty()){
                    finish=true;//提前结束
                    break;
                }
                current=seq.front();
                seq.pop_front();
                if(current>front){
                  if(box.size()==M){
                        seq.push_front(current);
                        finish=false;
                        break;//提前结束
                    }
                    else{
                        box.push(current);
                        continue;
                    }
                }
            }
            tree.push_back(current);
            front=current;
        }
        for(int i=0;i<tree.size();i++){
            if(i>0){
                cout<<" ";
            }
            cout<<tree[i];
        }
        cout<<endl;
        tree.clear();//数组清除直接用这个函数
    }
    return 0;
}
