PAT(Advanced Level)A1051. Pop Sequence
阿新 • • 發佈:2020-11-01
題意
按照1..N
的順序入棧,問題目要問的序列是否可以通過入棧出棧(棧的長度是有限的)的操作來獲得
思路
- 手動模擬
1..N
進棧的過程,同時進行判斷,向要求檢查的序列靠攏,在想要檢查的序列中設定游標cur = 0
,比如想要檢查的是1 2 3 4 5
,那麼第一次入棧的時候我們入棧1
,檢查棧頂元素是否等於cur
指向的元素1,如此反覆。 - ⚠️
- 注意棧的容量大小是有限制的,在模擬的時候要注意檢查
- 模擬結束之後棧中可能還有元素,需要再次依次出棧檢檢視是否符合。
#include <cstdio> #include <vector> #include <algorithm> #include <iostream> using namespace std; const int MAXN = 1010; int a[1010]; int stack[1010], top = -1; int main() { int capacity, seq_len, queries; cin >> capacity >> seq_len >> queries; for(int i=0;i<queries;i++) { for(int j=0;j<seq_len;j++) cin >> a[j]; int cur = 0; bool legal = true; //合法與否的判斷標誌 top = -1; for(int j=1;j<=seq_len;j++) //模擬1..N的入棧過程 { stack[++top] = j; if(top >= capacity) //檢查棧裡的元素個數是否超過容量 { legal = false; break; } while(top >= 0 && stack[top] == a[cur]) { top--; cur++; } } while(cur <= seq_len) { if(stack[top] != a[cur]) { legal = false; break; }else{ top--; cur++; } } if(!legal) cout << "NO\n"; else cout << "YES\n"; } return 0; }