PAT-ADVANCED1051——Pop Sequence
阿新 • • 發佈:2018-11-11
我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED
原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805427332562944
題目描述:
題目翻譯:
1051 彈出順序
給定一個最多可以保留M個數的堆疊。按1,2,3,...,N的順序將N個數字壓入棧並隨機彈出。 你需要判斷給定的數字序列是否是堆疊的可能彈出序列。 例如,如果M為5、N為7時,我們可以從堆疊中獲得1,2,3,4,5,6,7,但不能獲得3,2,1,7,5,6,4。
輸入格式:
每個輸入檔案包含一個測試用例。對於每個測試用例,第一行包含3個數字(全部不超過1000):M(堆疊的最大容量),N(入棧序列的長度)和K(要檢查的彈出序列的數量)。然後是K行,每行包含一個N個數字的彈出序列。一行中的所有數字都用空格分隔。
輸出格式:
對於每個彈出序列,如果確實是堆疊的可能彈出序列,則在一行中列印“是”,否則列印為“否”。
輸入樣例:
5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2
輸出樣例:
YES
NO
NO
YES
NO
知識點:棧
思路:按順序入棧,一旦棧頂元素與序列中當前元素相同即出棧
我們首先關注序列中的第一個元素,即令index = 0。
我們按1,2,3,4……的順序依次入棧,一旦棧的大小超過了M,判斷其為“NO”。
如果棧不為空,一旦棧頂元素的值和序列中索引為index的值相等,令棧頂元素出棧,且index++。
最後如果棧為空且入棧出棧過程中棧中的元素個數始終沒有超過M,則輸出“YES”,否則輸出“NO”。
時間複雜度是O(K * N)。空間複雜度是O(N)。
C++程式碼:
#include<iostream> #include<stack> using namespace std; int main() { int M, N, K; scanf("%d %d %d", &M, &N, &K); int nums[N]; stack<int> numStack; for(int i = 0; i < K; i++) { while(!numStack.empty()) { numStack.pop(); } for(int j = 0; j < N; j++) { scanf("%d", &nums[j]); } int index = 0; bool flag = true; for(int j = 1; j <= N; j++) { numStack.push(j); if(numStack.size() > M) { flag = false; break; } while(!numStack.empty() && numStack.top() == nums[index]) { index++; numStack.pop(); } } if(flag && numStack.empty()) { printf("YES\n"); } else { printf("NO\n"); } } }
C++解題報告: