某城有一火车站,有n节车厢从A方向驶入车站,按进站顺序为1~n,要求:让它按照某种特定顺序进入B方向的铁轨并驶出车站。其中有一个中转站C,用来重组车厢。
方法一:
按照数组方式完成:
#include<stdio.h>
#define MAXN 100+10
int n,target[MAXN];
int main()
{
int i;
while(scanf("%d",&n)){
int stack[MAXN];
for(i=1;i<=n;i++){
scanf("%d",&target[i]);
}
int A=1,B=1;
int ok=1;
int top=0;
while(B<=n){
if(A==target[B])
{
A++;
B++;
}
else
if(top&&stack[top]==target[B])
{
top--;
B++;
}
else
if(A<=n)
{
stack[++top]=A++;
}
else
{
ok=0;
break;
}
}
printf("%s\n",ok?"Yes":"No");5
}
return 0;
}
方法二:
按照栈的方式:
#include<stdio.h>
#include<stack>
#include<algorithm>
#define MAXN 1000+10
int target[MAXN];
using namespace std;
int main()
{
int n,i;
while(scanf("%d",&n))
{
stack<int> s;
int A=1,B=1;
for(i=1;i<=n;i++)
{
scanf("%d",&target[i]);
}
int ok=1;
while(B<=n)
{
if(A==target[B])
{
A++;
B++;
}
else
if(!s.empty() && s.top() == target[B] )
{
s.top();
B++;
}
else
if(A<=n)
{
s.push(A++);
}
else
{
ok=0;
break;
}
}
printf("%s\n",ok?"Yes":"No");
}
return 0;
}