程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【UVa-514】鐵軌——棧的學習,uva-514鐵軌

【UVa-514】鐵軌——棧的學習,uva-514鐵軌

編輯:C++入門知識

【UVa-514】鐵軌——棧的學習,uva-514鐵軌


UVa514 Rails(鐵軌)

題目:鐵軌

題目鏈接: 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中,車廂符合後進先出的原則。故這裡可以看做為一個棧。

\begin{picture}(6774,3429)(0,-10)\put(1789.500,1357.500){\arc{3645.278}{4.7247}......tFigFont{14}{16.8}{\rmdefault}{\mddefault}{\updefault}Station}}}}}\end{picture}

【代碼】

 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”聲明

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved