1. 程式人生 > >例題6-2(Rails, UVa 514)

例題6-2(Rails, UVa 514)

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 = 1000
+ 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]; 15
stack<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 }
My Code

下面給出書上給出的代碼(註:書上的代碼並不適應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)