class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 栈排序
* @param a int整型vector 描述入栈顺序
* @return int整型vector
*/
vector<int> solve(vector<int>& a) {
int size = a.size();
vector<int> ans, pre(size);
stack<int> stk;
pre[size-1] = INT_MIN;
for(int i=size-2; i>=0; i--){ //得到每一个数对应的后面的最大值,在进行入栈操作时,若本数大于辅助数组对应的数即后面出现的最大的数,则进入答案数组。若不大于,入栈,栈中一直是当前非数组中非最大的数;保证了进入的是当前剩余的最大的数;
pre[i] = max(pre[i+1], a[i+1]);
}
for(int i=0; i<size; i++){
if(a[i] > pre[i]){ //本数是当前剩余的最大数
ans.push_back(a[i]);
int lastMax = pre[i];
while(!stk.empty() && stk.top() > lastMax){ //反过来处理栈, 因为最大数改变了,栈中的元素可能变成当前最大数;
ans.push_back(stk.top());
stk.pop();
}
}else{
stk.push(a[i]);
}
}
while(!stk.empty()){ //最后处理剩余,栈里是递增排序的;
ans.push_back(stk.top());
stk.pop();
}
return ans;
}
};