1. 程式人生 > >PAT-ADVANCED1051——Pop Sequence

PAT-ADVANCED1051——Pop Sequence

我的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++解題報告: