.栈和排序

63 阅读1分钟
题目描述 
给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列
输入描述:
第一行一个数n
第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格
输出描述:
输出一行n个数表示答案,用空格隔开,结尾无空格
示例1
输入

5
2 1 5 3 4
输出

5 4 3 1 2

说明
2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
const int N=1e6+10;

int main()
{
	vector<int> v;
	stack<int> stk;
	int n,num[N];
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>num[i];
	}
	for(int i=1;i<=n;i++)
	{
		int max=n;
		stk.push(num[i]);
		if(num[i]==max)
		{
			stk.pop();
			cout<<max<<' ';
			--max;
		}	
	}
	while(!stk.empty())
	{
		v.push_back(stk.top());
		stk.pop();
	}
	for(int i=0;i<v.size();i++)
	{
		if(i==v.size()-1)
		printf("%d",v[i]);
		else
		printf("%d ",v[i]);
	}
	return 0;
}

上面这是我写的代码奈何无法通过这道题,可能是算法不好吧~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

下面这是题解:

思路:遇到最大值,就让最大值出栈,出栈后判断,判断后面有无比最大值前一个数大的数。若有:先让后面的入栈再出栈,若无:最大值前面的一个数出栈。下面代码用一个数组表示位置 i 后面的最大值。

#include<bits/stdc++.h>
using namespace std;

stack<int>q;

int main()
{
	int n,a[1000000],pos[1000000];
	cin>>n; 
	for(int i=0;i<n;i++)cin>>a[i];
	for(int i=n-1;i>=0;i--) pos[i]=max(pos[i+1],a[i]);
	for(int i=0;i<n;i++){
		q.push(a[i]);
		if(q.top()==pos[i]){//找到最大值
			cout<<q.top()<<" ";
			q.pop();
			while(!q.empty() && q.top()>pos[i+1]){
			//判断前一个数是否比后面的数大
				cout<<q.top()<<" ";
				q.pop();
			}
		}
	}
	while(!q.empty()){
		cout<<q.top()<<" ";
		q.pop();
	}
	return 0;
}