#include<stdio.h>
int top = -1;
int b[11];
void is(int n, int begin, int* a, int temp) { //判断用的函数 n代表目前 用户想要判断的数组里面还有多少数
if (begin > temp && top == -1) { //当所有的数已经被压入栈的时候,并且栈为空,也就是所有的数已经被 压入并且弹出时,表明满足栈的条件 ,输出Yes
printf("Yes\n");
top = -1;
} else if (begin > temp && b[top] != a[0]) { //当数已经全部压入,但是仍然栈顶元素不等于将要pop的数,即数无法被pop,则不满足栈,输出No
printf("No\n");
top = -1;
} else if (top == -1 || b[top] != a[0]) { //当目前的栈为空或者栈的栈顶元素不是要pop的那个数,就应该往栈里面压入数 , 并且栈的高度加一,数的个数要减少
top++;
b[top] = begin;
is(n, begin + 1, a, temp);
} else if (b[top] == a[0]) { //当栈顶元素等于将要beipop的数时,pop这个数,再次进行剩下的数的判断
b[top] = 0;
top--;
is(n - 1, begin, a + 1, temp);
}
}
int main() {
int a[11] = { 0 }; //数组的建立,存放用户用来测试的数
int i, j;
int num, n;
scanf("%d %d", &num, &n); //输入测试样例的个数和数的范围
for (i = 1; i <= num; i++) { //循环输入
for (j = 0; j < n; j++) {
scanf("%d", &a[j]);
}
is(n, 1, a, n); //判断函数
}
return 0;
}
我的所有文章都是基于学校布置的题目来的,所以哪个出题的师兄看到了不要说我出来show啊,有的可能会结合百度到的思路,但是我一定是在认真考虑后完成的。先来题目:
Erin最近很喜欢玩射击游戏。她刚考完了C语言的期末考试,感觉很溜,于是又来到了射击娱乐场放松一下。和上次一样,先从老板那租了一把步枪和装有N发子弹的弹夹。在射击的过程中,Erin每次都有两种选择:从弹夹中取出一颗子弹上膛,或者打一发子弹出去。注意:所有的子弹都从枪口上膛。Erin感觉这有点像C语言课程中的“栈”的特点。因此在打完了这N发子弹之后,她想验证一下这些子弹打出来的顺序是不是真的满足“栈”的特性。假设N颗子弹的编号为1,2,…,N。子弹从弹夹中取出的顺序也是从1到N。给定一个子弹被打出的顺序,你可以帮Erin验证其是否满足“栈”的打出顺序吗?
可能有多个测试输入,第一行给出总共的测试输入的个数T,和每个测试输入的子弹数N。(0 < T < 20, 0 < N < 10)
每个测试输入只有一行:用空格隔开的N个数,表示子弹打出的编号顺序。
输出YES或者NO表示判断结果
例如
INPUT:
2 4
4 3 2 1
4 2 3 1
OUTPUT:
YES
NO
以上为题目部分,下面我来写一下我的代码还有用注释说一下我的思路。首先,简化一下,就是问你一组数据是否满足出栈的条件,也就是pop是否符合,既然有pop,那么就有push了,判断pop首先得push进去,否则也就没有数据来输出。看题目,既然已经给定了数的范围,那么push也就有了范围,当所有的数全部push进去的时候,如果仍然不能pop完栈里面的数的话,那么这个就一定不会是满足栈的。可能有些笼统抽象,下面,我来用我的注释来解释吧,不会的请留言哦。