题目描述
给定一个数组, 找到每个元素右边第一个比它大的元素。
输入
第一行一个整数n,表示数组大小,
接下来一行n个正整数,表示数组中的元素值。
数据范围:n<=100000, 数组中元素值不超过1000000000。
输出
输出一行n个整数
表示每个元素右边第一个比它大的元素,如果没有输出-1。
样例输入
4
2 1 3 4
样例输出
3 3 4 -1
#include<iostream>
using namespace std;
class Stack
{
public:
Stack(){};
virtual void Push(const int&x)=0;
virtual bool Pop(int&x)=0;
virtual bool Isempty()const=0;
virtual bool Isfull()const=0;
};
class Seqstack:public Stack
{
private:
int *elements;
int maxsize;
void overflow();
public:
int top;
Seqstack(int sz=50);
~Seqstack(){delete[]elements;}
void Push(const int&x);
bool Pop(int&x);
bool Isempty()const{return(top==-1)?true:false;}
bool Isfull()const{return(top==maxsize-1)?true:false;}
};
Seqstack::Seqstack(int sz):top(-1),maxsize(sz)
{
elements=new int[maxsize];
}
void Seqstack::Push(const int&x)
{
if(Isfull()==true) overflow();
elements[++top]=x;
}
bool Seqstack::Pop(int&x)
{
if(Isempty()==true)return false;
x=elements[top++];
return true;
}
void Seqstack::overflow()
{
int *newarray=new int[maxsize+1000];
if(newarray==NULL)exit(1);
for(int i=0;i<=top;i++)
newarray[i]=elements[i];
maxsize=maxsize+1000;
delete[]elements;
elements=newarray;
}
int main()
{
Seqstack num;
int n,i,a,j,now,max,move,savetop;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a;
num.Push(a);
}
num.top=0;
for(i=0;i<n;i++)
{
num.Pop(now);
max=now;
savetop=num.top;
for(j=i+1;j<n;j++)
{
num.Pop(move);
if(move>max)
{
max=move;
break;
}
}
if(max==now)
cout<<"-1"<<' ';
else
cout<<max<<' ';
num.top=savetop;
}
return 0;
}