Rails UVA - 514 (棧的應用)
阿新 • • 發佈:2018-12-18
最初看到這個題不是很明白題意,反覆理解了之後才明白。
也就是說,已知進棧的順序是從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;
}