題目:鐵軌
題目鏈接: UVa514鏈接
題目描述:
某城市有一個火車站,有n節車廂從A方向駛入車站,按進站的順序編號為1-n.你的任務是判斷是否能讓它們按照某種特定的順序進入B方向的鐵軌並駛入車站。例如,出棧順序(5 4 1 2 3)是不可能的,但是(5 4 3 2 1)是可能的。
題目分析:
為了重組車廂,借助中轉站,對於每個車廂,一旦從A移入C就不能回到A了,一旦從C移入B,就不能回到C了,意思就是A->C和C->B。而且在中轉站C中,車廂符合後進先出的原則。故這裡可以看做為一個棧。
【代碼】
1 #include<cstdio> 2 #include<stack> 3 using namespace std; 4 const int N = 1005; 5 int n, tar[N], A, B; 6 int main() 7 { 8 while (scanf ("%d", &n), n) 9 { 10 while (scanf ("%d", &tar[1]), tar[1]) 11 { 12 for (int i = 2; i <= n; ++i) 13 scanf ("%d", &tar[i]); 14 stack<int> sta; 15 A = B = 1; 16 bool ok = true; 17 while (B <= n) 18 { 19 if (A == tar[B]) 20 { ++A; ++B; } 21 else if (!sta.empty() && sta.top() == tar[B]) 22 { sta.pop(); ++B; } 23 else if (A <= n) 24 sta.push (A++); 25 else 26 { ok = false; break; } 27 } 28 printf (ok ? "Yes\n" : "No\n"); 29 } 30 printf("\n"); 31 } 32 return 0; 33 }
【分析】
A代表A中當前待進站的第一輛火車
tar[B]代表出戰序列中當前應該出站的火車
棧sta代表火車站(棧)
判斷條件:
1.當A == tar[B]時,A進站馬上出站,即表示當前序列可以實現
2.棧頂(車站中的末尾火車)與輸入的出站序列比較,若相同,出站,並繼續向下比較
3.以上若不成立,則將當前A壓入棧中
4.出站序列不存在,即A > n,車站中仍有火車,說明輸入的出站序列無法實現
【總結】
bool emply() 判斷棧是否為空
void push() 將新元素壓入棧中
void pop() 用於棧不為空時,彈出棧頂元素
void top() 用於取棧頂元素(但不刪除)
STL的棧定義在頭文件<stack>中,可以用“stack<int> s”聲明