输入:两行,第一行为n,代表元素的数量,第二行为n个数,代表n个元素,每个元素之间用一个空格隔开。
输出:一行,代表出栈顺序是否合法,合法输出YES,不合法输出NO。
【输入样例1】:
5
1 2 5 3 4
【输出样例1】:
NO
【输入样例1】:
7
1 7 6 5 4 3 2
【输出样例1】:
YES
提示:1<=n<100。
#include<iostream>
using namespace std;
int t[105];// t数组存储元素,相当于栈
int top;// 标记最后一个元素所在位置
int a[105];//出栈顺序(入栈顺序为从1到n)
int main(){
int n;//元素数量
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}//输入出栈顺序
int k=1;//曾入栈的数
int flag=0;//是否为合法的出栈序列(是为0,不是为1)
for(int i=1;i<=n;i++){//遍历
while(k<=a[i]){//把a[i](要出栈的)数前面的数都入栈
top++;//最后一个元素所在位置++
t[top]=k;//入栈 (因为入栈顺序为从1到n)
k++;//曾入栈的数++
}
if(a[i]==t[top]){//如果a[i]能出栈
top--;//出栈
}else{
flag=1;//不是合法的出栈序列
break;//及时打断,已经是不合法的出栈序列,就要避免无效计算,减小时间复杂度(优化)
}
}
if(flag==0){
cout<<"YES";
}else{
cout<<"NO";
}
return 0;
}