本来今天是想总结一下动态规划和双指针的,但计划赶不上变化,今天有点忙。剩下的一小点时间我又去理解栈了。
关于出栈序列的合法性:
出栈序列中的每个数后面的比它小的数,是按递减排列的。
假设入栈顺序为1234......n,可知在栈中的元素从栈顶到栈底一定是按严格递减排列的,而且每个数i进栈之前,比i小的数一定已经进栈了。
所以比i小的数要不然已经出栈,要不然在栈中,如果还在栈中则一定在i的下面,按严格递减排列,如此可见如果比i小的数还在栈中则一定在i之后输出,所以输出序列中在i后面的比i小的数一定按严格递减排列.否则出栈系列不合法。
例题:
已知自然数 1,2,⋯,N(1≤N≤100)依次入栈,请问序列 C1,C2,⋯,CN 是否为合法的出栈序列。
输入格式
输入包含多组测试数据。
每组测试数据的第一行为整数 N(1≤N≤100),当 N=0 时,输入结束。
第二行为 N 个正整数,以空格隔开,为出栈序列。
输出格式
对于每组输入,输出结果为一行字符串。
如给出的序列是合法的出栈序列,则输出"Yes"
,否则输出"No"
。
Sample Input
5 3 4 2 1 5 5 3 5 1 4 2 0
Sample Output
Yes No
代码如下:
#include<stdio.h>
#define N 1000
int main()
{
int n,i=0,r=0,c,z;
int a[N]={0};
while(~scanf("%d",&n))
{
z=0;
if(n==0)
break;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
for(r=i+1;r<n;r++)
{
if(a[i]>a[r])
{
c=a[r];
break;
}
}
for(r=i+1;r<n;r++)
{
if(a[i]>a[r])
{
if(c<a[r])
z++;
else
c=a[r];
}
}
if(z>0)
{
printf("No\n");
break;
}
}
if(z==0)
printf("Yes\n");
}
return 0;
}
没错,我没有用栈算法来写,还不熟练。只能先用普通的方法表示出来了。
明天有课,抽空再学学吧。