牛客:第二届太原理工大学程序设计新生赛决赛(重现赛)--C Nitori and Stack-Tech(栈)

链接:题目
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 262144K,其他语言524288K

Special Judge, 64bit IO Format: %lld

题目描述

Nitori擅长制作各种各样精巧的道具。

这一天,Nitori找来n个不同的零件放在桌子上,将它们排列成一排,接着她便拿出一个被她称为“栈”的神奇道具,这个道具可以将无数多个零件放进去,并且也可以按照与放入顺序相反的顺序将零件取出来(即后放入的零件必须先取出来),并且她还可以只取出一部分后继续放入其它的零件,而不必一次性全部取完。

Nitori十分喜爱这个叫做“栈”的道具,今天,她想用“栈”将桌上的零件调整一下排列顺序,她会把桌上的零件从左到右依次放入“栈”中,并且在任意时刻,她都可以将若干个先前放进栈中的零件取出(需要按照“栈”的后入先出顺序),并从左到右在桌子上摆放出来。

她想知道是否可能将桌上物品的排列s,通过上述操作,转化为另一种排列t。
输入描述:
第一行输入一个正整数n,表示n个零件。
第二行输入一个长度为n,由不同小写字母组成的字符串s,表示初始从左到右排列的n种零件。
第三行输入一个长度为n,由不同小写字母组成的字符串t,表示Nitori希望得到的排列。

数据规范:

  • 1≤n≤261 \le n \le 261≤n≤26.
  • 所有字符串保证只含有小写字母。
    输出描述:
    如果能够通过“栈”将排列s变成t,则输出"Yes"\texttt{“Yes”}“Yes”,反之输出"No"\texttt{“No”}“No”。(不包含双引号,大小写任意)
    输入:
7
abcedfh
aecbfdh

输出:

Yes

说明

如果使用u表示入栈,使用o表示出栈,则此组数据可通过操作:
uouuuooouuoouo
从s排列得到t排列。
思路:遇到相等的就往外出,最后判断是否为空
代码:

#include
using namespace std;
typedef long long int ll;
int n;
string s,str;
int main()
{
 cin>>n>>s>>str;
 stack<char> q;
 int i=0,j=0;
 while(i<n)
 {
  q.push(s[i++]);
  while(!q.empty()&&q.top()==str[j])
  {
   q.pop();
   j++;
  }
  } 
  if(q.empty())printf("YES");
  else printf("NO");
 return 0;
}

你可能感兴趣的:(数据结构)