今天没打金刚功,也没有晚自习,学校因为疫情又封了,这个星期先把任务完成,下周开始得准备一下期末考试了,大概率要挂几门科,把时间都花在专业上了。
写一下出栈的合理性。
例如n是5,那么入栈次序就是1,2,3,4,5,如果我们希望出栈次序同样是1,2,3,4,5,那只要每push一个数,就立即pop一个数。如果我们希望出栈次序是3,2,4,5,1,那么我们先让1,2,3入栈,然后pop出来3和2,接着4入栈后马上pop,再就是5入栈后马上pop,最后再把栈里的1pop出。再例如,如果我们希望出栈次序是5,4,1,2,3,这是办不到的,如果要让5最先出栈,那么出栈次序只可能是5,4,3,2,1。
所以假设我们要判断a,b,c,d......是否出栈合理,先要把1到a的数存在数组里,将栈顶也就是a从数组中删除,再来判断b,如果b小于a,那么显然b只能等于a-1,否则直接判断错误。如果b大于a,再来将a+1到b的数给数组,将栈顶也就是b从数组中删除。以此类推。所以从第二个数开始只要遇到比前面小的数就看是否等于栈顶,遇到比前面大的数就存数给数组。每次处理一个数时数组应该都会变。这里的数组其实就是栈。假设我将要判断的n个数赋值给数组a,判断的代码为:
for(i=1;i<=n;i++)
{
for(j=max+1;j<=a[i];j++)
{
max=j;
stack[top++]=j;
if(top>n){
printf("No\n");
goto out;
}
}
if(stack[--top]!=a[i]){
printf("No\n");
goto out;
}
}
printf("Yes\n");
out:
链表还没动,明天开始写吧。