继续是栈和队列,今天主要是栈,做了一道关于出栈序列的题目。
最开始我用暴力的方法将每出现的数包含其本身往后确认,使用过的数字用vis数组标记,于是我可以随着序列数字的推进每次都for循环往下推,如果一致那么就算是可实现的序列,而要是有匹对不上的数字那么就代表序列错误。可是当我提交上去时,显示的是时间超限,于是我开始换思路。
咳咳,最后,在借鉴了一下别人的思路之后终于是成功ac。思路如下:首先将序列输入到一个数组中,自定义一个函数,功能为在一个for循环中按原本题目设定的入栈顺序入栈,可在入栈的同时也判断是否达到输入出栈序列的第一个数,如果达到了,也就是两数一致的时候,在入栈的数组中进行pop,也就是我模拟的top--,同时也要给出栈序列的下标++,这样子就可以让入栈了的数字与出栈序列里的数字相比较,没有违背入栈顺序,也可以跟按照出栈顺序出栈,而现在,当入栈for完成之后,如果出栈顺序是可行的话呢,此时栈中不会有任何数,也就是说top是<=0的。所以,方法正确,可执行。
题目如下:
代码如下:
#include <stdio.h>
int p[10010],q[10010],top,top2,n,k,i;
int jud()
{
for(i=1;i<=n;i++)
{
q[++top]=i;
while(top>=1&&q[top]==p[top2])
top--,top2++;
}
if(top>0)
return 1;
return 0;
}
int main()
{
while(1)
{
scanf("%d",&n);
if(n==0)
break;
while(1)
{
top=0;top2=1;
scanf("%d",&k);
if(k==0)
break;
p[1]=k;
for(i=2;i<=n;i++)
scanf("%d",p+i);
if(jud())
printf("No\n");
else printf("Yes\n");
}
printf("\n");
}
return 0;
}
咳咳,还有大学物理,写了几题考试真题,虽然还有困惑,可还在可解决的范围之内,以及大学英语,主要是记了十几个单词。写了几个不定积分分部积分法的题目,了解了有理函数的积分问题,对了,高数老师有讲一个解分部积分题的技巧,就是当我们分部积分时总会需要挑选U和V',此时有一个推荐的使用,即“反函数、对数函数、幂函数、指数函数、三角函数”的顺序,当出现这些函数时,靠前的用作U,后者则当作V',这个值得记录。
其实这样的学习效率还远远不够,明天要好好改善,要有效率的学习。