18715 出栈序列
Description
一种简洁的栈定义方法如下
int st[1000],top=0;//以top作为栈顶指针,top==0为空栈
st[top++]=x;//把x入栈,栈顶指针+1
top–;//出栈
现在有一个1-n的排列,入栈序列已知,请给出字典序最大的出栈序列。
输入格式
第一行一个整数n。(1<=n<=100)
第二行n个整数,数据确保为1-n的排列。
输出格式
输出n个整数,既字典序最大的出栈序列。
输入样例
5
1 2 4 5 3
输出样例
5 4 3 2 1
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
//定义顺序栈
int st[105],top = 0;
int n,a[105];
cin >> n;
for(int j = 0;j < n;j++){
cin >> a[j];
}
//入栈、出栈
int i = 0;//数组下标
int ma;//目前最大元素
int k;//标记
//遍历数组
while(i < n || top != 0){
if(top == 0) st[top++] = a[i++];//栈为空,入栈
else{ //栈不为空
ma = st[top-1];//取栈顶元素作为目前最大元素
k = 0;//初始化标记
//遍历未入栈的数组元素
for(int j = i;j < n;j++){
if(a[j] > ma){ //如果大于目前最大元素,替换
ma = a[j];
k = j;//标记位置
}
}
if(k != 0){ //存在比目前栈顶元素更大的元素,该元素及其之前的元素入栈
for(int j = i;j <= k;j++){
st[top++] = a[j];
}
i = k + 1;//从最大元素之后继续遍历
}
//输出目前最大的栈顶元素(因为前一位和后一位都比他小)
cout << st[top-1] << " ";
top--;//栈顶元素出栈,栈不为空或者i未遍历完继续遍历
}
}
return 0;
}