写一下我的第二篇博客吧,关于栈的,灵感来自一道作业题

#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。子弹从弹夹中取出的顺序也是从1N。给定一个子弹被打出的顺序,你可以帮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完栈里面的数的话,那么这个就一定不会是满足栈的。可能有些笼统抽象,下面,我来用我的注释来解释吧,不会的请留言哦。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章