题目
思路:
先从后往前找到此时的最大值,存入数组b中
然后从前往后遍历,
当此时i位置的值为最大值时入栈,入栈后还需要比较此时辅助栈中的数值和下一个遍历到的位置的b[i+1]中的值的大小比较,若栈顶数值大于b[i+1]就入栈;
若此时i位置的值不为最大值,就将此值存入辅助栈中。
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
stack<int>st,c;
int main() {
int n,x;cin>>n;
int a[n+10],b[n+10],ans[n+10];
for(int i=0;i<n;i++)cin>>a[i];
for(int i=n-1,maxx=0;i>=0;i--){
maxx=max(maxx,a[i]);
b[i]=maxx;
}
int pos=0;
for(int i=0;i<n;i++){
if(a[i]==b[i]){
ans[pos++]=a[i];
while(!st.empty()&&st.top()>b[i+1]){
ans[pos++]=st.top();
st.pop();
}
}else{
st.push(a[i]);
}
}
while(!st.empty()){
ans[pos++]=st.top();st.pop();
}
for(int i=0;i<n-1;i++){
cout<<ans[i]<<" ";
}cout<<ans[n-1];
return 0;
}