1. 程式人生 > >【HDU】1022Train Problem I(出棧可行問題)

【HDU】1022Train Problem I(出棧可行問題)

題目大意:給出一個數(車的數目),兩個字串(前一個為現有車的排序,第二個為要組成的車的排序),

Sample Input

3 123 321

3 123 312

Sample Output

Yes.

in

in

in

out

out

out

FINISH

No.

FINISH

思路:直接用stack模擬棧的順序:

首先如果出棧序列可行,那麼必定存在唯一的可行出棧方式(想想是不是)

我們需要兩個指標i,j,用來指定in順序和out順序的位置,

如果當前棧頂元素等於out序列中j所指向的那個字元,那麼就出棧並且儲存com【len++】=“out”;

如果當前的字元出棧不可行時,我們就把in中i所指向的字元加入棧中即可;在判斷下一個i;

注意棧操作時:

出棧:棧S不能為空  且  j不能超過出棧序列的最後一個元素 且 S.top() == j所指元素

        入棧:i不能超過入棧序列的最後一個元素

程式碼:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#define maxn 33
using namespace std;

string in;
string out;
string com[maxn];
int n;
int main()
{
    while(cin>>n)
    {
        cin>>in>>out;
        int len=0;
        stack<char>s;
        int i=0,j=0;
        while(i<n&&j<n)
        {
            if(in[i]==out[j]) //相同時,進~出
            {
                com[len++]="in";
                com[len++]="out";
                i++;
                j++;
            }
            else if(s.empty()||(s.top()!=out[j]))//不滿足時,進~
            {
                com[len++]="in";
                s.push(in[i]);
                i++;
            }
            else//出~
            {
                com[len++]="out";
                s.pop();
                j++;
            }
        }
        while(!s.empty()&&s.top()==out[j])//判斷是否可以出
        {
            com[len++]="out";
            s.pop();
            j++;
        }
        if(s.empty())//棧中無元素時表示恰好可以完成工作,把儲存的路徑輸出即可
        {
            cout<<"Yes."<<endl;
            for(int i=0;i<len;i++)
                cout<<com[i]<<endl;
            cout<<"FINISH"<<endl;
        }
        else
        {
            cout<<"No."<<endl;
            cout<<"FINISH"<<endl;
        }
    }
    return 0;
}