南邮 OJ 2024 入栈序列和出栈序列

入栈序列和出栈序列

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 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.

输出

一行,字典序最大的出栈序列.   每个数字以空格分开。

样例输入


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");
}


你可能感兴趣的:(ACM,南邮OJ,入栈序列和出栈序列)