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