1. 程式人生 > >Rails UVA - 514 (棧的應用)

Rails UVA - 514 (棧的應用)

題目連線

最初看到這個題不是很明白題意,反覆理解了之後才明白。
也就是說,已知進棧的順序是從1~n,然後 給定一種出棧的順序,判斷這個出棧順序是否能夠成立。
比如n為3的時候
可能的出棧順序就是
3,2,1 (所有火車入棧之後再一輛輛出棧)或者 1,2,3 (這種是入一輛出一輛),也可能是2,3,1
(就是1入,2入,2出,3入,3出,1出)等。

那麼該怎麼考慮這個問題呢
那麼首先用一個數組a[maxn]來儲存題中給出的出棧順序。
然後進行比對。
設i=1(i用來表示入棧的火車),j=1(用來表示出棧的火車陣列下標);

那麼當 i==a[j]時,說明這輛火車是入棧後,緊接著就出棧了,則成立,我們就 考慮下一個i和下一個j(i++,j++)
如果 i != a[j] 時,那麼就考慮當前的棧尾的火車,是不是等於a[j] 如果是的話,就使這輛火車出棧,然後j++,考慮下一個火車。
如果不等於棧尾的火車,那麼就 先將i壓入棧。
臨界條件則是 i>n了 而j還沒有到 n 這個時候就肯定不能實現了

AC程式碼如下:

#include <iostream>
#include <stack>
using namespace std;
const int maxn=1e3;
int a[maxn]; //用來存放出棧火車的順序
int main()
{
    int n;//n輛火車
    while(cin>>n && n )
    {
        for(int k=0;k<n;k++)
        {
            cin>>a[k];
            if(!a[k])
                break
; if(k==n-1) { int i=1; stack <int> st; //用來模擬火車的出棧入棧 bool tag=false; for(int j=0;j<n;) //遍歷出棧火車 { if(i==a[j])//入棧後立馬出棧的情況 i++,j++; else
if( !st.empty() && st.top()==a[j]) j++,st.pop(); else if ( i<=n )st.push(i++); else //說明這時候不滿足了 { tag=true; break; } } if(tag) cout<<"No"<<endl; else cout<<"Yes"<<endl; } if(k==n-1 && a[0]) k=-1; } cout<<endl; } return 0; }