寫一下我的第二篇博客吧,關於棧的,靈感來自一道作業題

#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完棧裏面的數的話,那麼這個就一定不會是滿足棧的。可能有些籠統抽象,下面,我來用我的註釋來解釋吧,不會的請留言哦。


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