题目链接 https://vjudge.net/problem/UVA-514#author=0
这个题就是栈混洗第三种甄别方法,利用的是贪心的思想
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
using namespace std;
int main()
{
int n;
int num[1005];
while(cin>>n&&n){
memset(num,0,sizeof(num));
while(scanf("%d",&num[1])==1){
if(num[1]==0) break;
for(int i=2;i<=n;i++)
scanf("%d",&num[i]); //num表示待判断是符合栈混洗的车列
int a,b,ok;
a=1;b=1;ok=1; //a就相当于(1,2,3.....n)初始顺序车列也相当于右栈"a",b相当于左栈相当于左栈"b"。
stack<int> s; //s就相当于中栈,表示栈"s"
while(b<=n){
if(a==num[b]){a++;b++;} //如果此时的a车列正好是num(进入的车列),那么相当于直接进入栈b(a->s->b),a++表示处理下一辆车,而b++表示b栈进入一辆车此时数量加一
else if(!s.empty()&&s.top()==num[b]){s.pop();b++;} //如果此时a栈并不是num中需要的,但是此时s栈的栈顶是需要的,那么从s进b一辆,b数量加一,同时s栈顶弹出
else if(a<=n) {s.push(a);a++;} //如果a栈不是此时num中需要的,先将驶入s栈中
else {ok=0;break;} //如果a不是num的需要,而且s栈顶也不是,那么就不符合题意(栈混洗)
}
if(ok)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;}
cout<<endl;
}
return 0;
}
栈混洗的介绍 栈混洗