题目链接 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;elsecout<<"No"<<endl;}cout<<endl;}return 0;
}
栈混洗的介绍 栈混洗