现有一个空栈s和一个正整数n,将1,2,3,...,n依次入栈,期间任意时刻出栈。然后给定一个出栈序列,问其是否是一个合法的出栈序列。
解题思路:
我们读取出栈顺序时候发现会有三种可能:
1.该数大于栈顶的数,说明原先没有将该数入栈,那么应该先入栈到该数。
2.该数等于栈顶的数,那么应该正常弹出。
3.该数小于栈顶的数,那么就说明该出栈序列不合法。
代码如下:
#include <iostream>
#include <stack>
using namespace std;
int main(){
int n;
cin>>n;
int temp;
int max = 0;
stack<int> s;
bool flag = true;
for(int i=1;i<=n;i++){
cin>>temp;
if(!flag){
continue;
}
if(temp>max){
for(int j=max+1;j<=temp;j++){
s.push(j);//将上一次入栈的数+1,到当前temp的数进行入栈。
}
max = temp;
}
if(s.top()!=temp){
flag = false;
break;
}
else{
s.pop();
}
}
if(flag){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
return 0;
}