70,020
社区成员




//下面是我个人比较抽浅的理解 仅供参考
1. 出栈系列合法性规则:
出栈序列中的每个数后面的比它小的数,是按递减排列的。
2. 简化规则描述:
(1)假设入栈顺序为1234。
1)若出栈序列为4123,显然不满足上述要求,因为对于4,它后面比它小的数字序列为123,而123是一个
递加系列即不是递减排列,所以不是合法出栈序列。
2)若出栈系列为3142,也不合法,因为3后面比它小的1和2不是递减排列的。
3)若出栈系列为1234,则合法,因为对于每一个数字它后面没有比它小的数字。
(2)假设入栈顺序为123456789abcdef。
1)若出栈系列为67d51f94e2ba83c,因为对于d,它后面比它小的19或123或ac等等都不是递减的,所以
不合法。
2)若出栈系列为379a8b65c4ed21f,可以证明是合法的出栈顺序。因为对于每一个数字它后面没有比它小
的数字而且是按递减排列的。
3. 证明:
假设入栈顺序为1234......n,可知在栈中的元素从栈顶到栈底一定是按严格递减排列的,而且每个数i进
栈之前,比i小的数一定已经进栈了,所以比i小的数要不然已经出栈,要不然在栈中,如果还在栈中则一定在i的
下面,按严格递减排列,如此可见如果比i小的数还在栈中则一定在i之后输出,所以输出序列中在i后面的比i小
的数一定按严格递减排列.否则出栈系列不合法。
//下面是我个人比较抽浅的理解 仅供参考
1. 出栈系列合法性规则:
出栈序列中的每个数后面的比它小的数,是按递减排列的。2. 简化规则描述:
(1)假设入栈顺序为1234。
1)若出栈序列为4123,显然不满足上述要求,因为对于4,它后面比它小的数字序列为123,而123是一个递加系列即不是递减排列,所以不是合法出栈序列。 2)若出栈系列为3142,也不合法,因为3后面比它小的1和2不是递减排列的。 3)若出栈系列为1234,则合法,因为对于每一个数字它后面没有比它小的数字。 (2)假设入栈顺序为123456789abcdef。 1)若出栈系列为67d51f94e2ba83c,因为对于d,它后面比它小的19或123或ac等等都不是递减的,所以不合法。 2)若出栈系列为379a8b65c4ed21f,可以证明是合法的出栈顺序。因为对于每一个数字它后面没有比它小的数字而且是按递减排列的。 3. 证明:
假设入栈顺序为1234......n,可知在栈中的元素从栈顶到栈底一定是按严格递减排列的,而且每个数i进栈之前,比i小的数一定已经进栈了,所以比i小的数要不然已经出栈,要不然在栈中,如果还在栈中则一定在i的下面,按严格递减排列,如此可见如果比i小的数还在栈中则一定在i之后输出,所以输出序列中在i后面的比i小的数一定按严格递减排列.否则出栈系列不合法。
#include <stdio.h>
#define POP 0
#define PUSH 1
int main()
{
char strIn[10],strOut[10];
char cstack[10];
bool bResultSeq[20];//false in and true out
int nTrains;
int i,j,k;
int nTop;
while(scanf("%d",&nTrains)!=EOF && scanf("%s",strIn)!=EOF && scanf("%s",strOut)!=EOF)
{
nTop=0;
i = 0;//strIn
j = 0;//strOut
k = 0;//bResultSeq
while(i<nTrains)
{
cstack[nTop++]=strIn[i++];
bResultSeq[k++]=PUSH;
while(nTop>0 && cstack[nTop-1]==strOut[j])
{
nTop--;
bResultSeq[k++]=POP;
j++;
}
}
if (nTop>0)
{
printf("No.\n");
}
else
{
printf("Yes.\n");
for (i=0;i<k;++i)
{
if(bResultSeq[i]==PUSH)
printf("in\n");
else
printf("out\n");
}
}
printf("FINISH\n");
}
return 0;
}