【HDU】1022Train Problem I(出棧可行問題)
阿新 • • 發佈:2018-12-15
題目大意:給出一個數(車的數目),兩個字串(前一個為現有車的排序,第二個為要組成的車的排序),
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; }