题目:Nitori and Stack-Tech
来源:第二届太原理工大学程序设计新生赛决赛(重现赛)

解题思路

把桌上的 n 个零件从左到右依次放入栈中,并且在任意时刻,可以将若干个先前放进栈中的零件取出(需要按照“栈”的后入先出顺序),并从左到右在桌子上摆放出来。
是否可能将桌上物品的排列 s1,通过上述操作,转化为另一种排列 s2

C++代码

#include<iostream>
#include<stack>
using namespace std;

int main(){
    int n;
    cin >> n;
    string s1, s2;
    cin >> s1 >> s2;
    stack<char> sta;
    int j = 0;
    bool flag = false;
    for(int i=0; i<n; ++i){
        sta.push(s1[i]);
        while(!sta.empty() && j<n && sta.top()==s2[j]){
            sta.pop();
            ++j;
        }
        if(j == n){
            flag = true;
            break;
        }
    }
    if(flag)
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
    return 0;
}