入栈序列和出栈序列
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 260 测试通过 : 60
总提交 : 260 测试通过 : 60
比赛描述
给出入栈序列{A},保证{A}各个元素值各不相等,输出字典序最大的出栈序列.
如入栈序列{A} = 1, 2, 9, 4, 6, 5
则字典序最大的出栈序列为9, 6, 5, 4, 2, 1
输入
第一行一个整数n (1 <= n <= 100).
接下来是入栈序列{A}, n个正整数ai(0 < ai < 1000),且i != j则ai != aj.
输出
一行,字典序最大的出栈序列. 每个数字以空格分开。
样例输入
6
2 1 9 4 6 5
样例输出
9 6 5 4 1 2
提示
null
题目来源
NUPT
// AC 5MS
#include<iostream>
#include<stack>
#define MAX_N 100
using namespace std;
int main(){
// freopen("test.txt","r",stdin);
int a[MAX_N],n,i,j,maxIndex,maxVal;
bool firstFlag = 1;
stack<int> si;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",a+i);
}
i = 0;
while( !si.empty() || i<n ){
if( si.empty() ){ //栈为空,直接入栈
si.push(a[i++]);
}else{ //栈不为空,找到后面的最大值,若大于栈顶元素,则全部入栈
maxVal = si.top();
maxIndex = -1;
for(j=i;j<n;j++){
if(maxVal < a[j]){
maxVal = a[j];
maxIndex = j;
}
}
if(maxIndex != -1){
for(j=i;j<=maxIndex;j++){
si.push(a[j]);
}
i = maxIndex+1;
}
if(firstFlag){
firstFlag = 0;
}else{
printf(" ");
}
printf( "%d",si.top() );
si.pop();
}
}
printf("\n");
}