ACM汇总学习:https://blog.csdn.net/weixin_39778570/article/details/83187443
Rails
题目:https://vjudge.net/problem/UVA-514
题意:给定一个出轨顺序,入轨顺序为1-N,中途有个栈,可以随时出栈出轨,或者入轨者进栈,判断出轨顺序是否合理
解法:首先判断入轨者是否与当前出轨者相同,相同出轨,否者,若栈非空,判断栈头是否与出轨者相同,相同出轨,否者入轨者入栈,若入轨者全入轨完毕,任然无法匹配成功,则宣告失败
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
int n, a[2000];
stack<int> st;
void solve(){
while(!st.empty())st.pop();
int A=1,B=1;
bool ok = true;
while(B<=n){
if(A==a[B]){ // 判断队头是否有相同的
A++,B++;
}else if(!st.empty() && st.top()==a[B]){ // 判断栈里是否有相同的
st.pop();B++;
}else if(A<=n)st.push(A++); // A还没完,入栈
else{// A完了还没找到a[B]
ok = false;
break;
}
}
if(ok)puts("Yes");
else puts("No");
}
int main(){
while(scanf("%d",&n) && n){
while(1){
scanf("%d",&a[1]);
if(a[1]==0){
putchar(10);
break;
}
fo(i,2,n){
scanf("%d",&a[i]);
}
solve();
}
}
getchar();
return 0;
}