題目:鐵軌
題目鏈接: 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”聲明