例題6-2(Rails, UVa 514)
阿新 • • 發佈:2018-01-30
using view 存儲 st表 get problem body closed 分享
題目鏈接
給定入棧順序,問能否以給出的順序出棧。
眾所周知,棧的特點是先入後出。
此特點在該題中體現為對於當前需要出棧的元素(要想先出),必須位於棧頂或者還未入棧(必須後入)。
用數組target來存儲出棧序列,target[B_now] 表示當前需要駛入B的車廂(即當前需要出棧的元素),A_first表示當前A中第一個車廂(即下一個入棧元素)
1 #include <iostream> 2 #include <stack> 3 using namespace std; 4 5 const int MAX_N = 1000My Code+ 10; 6 7 int main() { 8 int N, target[MAX_N]; 9 10 while(cin >> N && N != 0) {//多個block的循環 11 while(true) {//多個序列的循環 12 cin >> target[0]; 13 if(target[0] == 0) break; 14 for(int i=1; i<N; i++) cin >> target[i]; 15stack<int> s; 16 int A_first = 1, B_now = 0; //設A中第一個元素為A_first,當前駛入B的元素為B_now 17 for(; B_now<N; B_now++) { 18 while( (s.empty() || s.top() != target[B_now]) && A_first <= N) {/*如果棧空或棧頂元素不為target[B_now] 19 且A中還有元素,從A中入棧*/ 20 s.push(A_first); A_first++; 21 } 22 if(s.top() == target[B_now]) s.pop(); 23 else { cout << "No" << endl; break; } 24 } 25 if(B_now == N) cout << "Yes" << endl; 26 } 27 cout << endl; 28 } 29 return 0; 30 }
下面給出書上給出的代碼(註:書上的代碼並不適應oj上的輸入模式,故直接提交結果為WA)
1 // UVa514 Rails 2 // Rujia Liu 3 #include<cstdio> 4 #include<stack> 5 using namespace std; 6 const int MAXN = 1000 + 10; 7 8 int n, target[MAXN]; 9 10 int main() { 11 while(scanf("%d", &n) == 1) { 12 stack<int> s; 13 int A = 1, B = 1; 14 for(int i = 1; i <= n; i++) 15 scanf("%d", &target[i]); 16 int ok = 1; 17 while(B <= n) { 18 if(A == target[B]){ A++; B++; } 19 else if(!s.empty() && s.top() == target[B]){ s.pop(); B++; } 20 else if(A <= n) s.push(A++); 21 else { ok = 0; break; } 22 } 23 printf("%s\n", ok ? "Yes" : "No"); 24 } 25 return 0; 26 }View Code
例題6-2(Rails, UVa 514)