Stack基本练习题,没用STL,在Uva Status上排名第四,也是我在UVA排名最靠前的一题!
#include<stdio.h>
#include<string.h>
#define MAXN 1010
int main()
{
int n,target[MAXN],i,j,k,top,len,sum,ok,A,B;
int stack[MAXN];
char str[10010];
while(scanf("%d ",&n)==1 && n)
{
while(gets(str)!=NULL && strcmp(str,"0"))
{
len = strlen(str);
k = 0;
for(i=0;i<len;i++)
{
sum=0;
while(str[i]>='0'&&str[i]<='9')
{
sum=10*sum+(str[i]-'0');
i++;
}
target[++k]=sum;
}
ok = 1;
A = B = 1;
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;}
}
if(ok)
printf("Yes\n");
else
printf("No\n");
}
putchar('\n');
}
return 0;
}
///
下面是STL代码:
#include<cstdio>
#include<stack>
#include<string.h>
using namespace std;
const int MAXN = 1000 + 10;
int n, target[MAXN];
char str[100000];
int main()
{
while(scanf("%d\n", &n) == 1&&n)
{
while(gets(str)&&strcmp(str,"0")!=0)
{
int i=0,k=0,len=strlen(str);
for(i=0;i<len;i++)
{
int sum=0;
while(str[i]>='0'&&str[i]<='9')
{
sum=10*sum+(str[i]-'0');
i++;
}
target[++k]=sum;
}
stack<int> s;
int A = 1, B = 1;
int ok = 1;
while(B <= n)
{
if(A == target[B]){ A++; B++; }
else if(!s.empty() && s.top() == target[B]){ s.pop(); B++; }
else if(A <= n) s.push(A++);
else { ok = 0; break; }
//getchar();
}
printf("%s\n", ok ? "Yes" : "No");
}
printf("\n");
}
return 0;
}