二届太原理工大学程序设计新生赛决赛 C Nitori and Stack-Tech

题目链接

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

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

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

她想知道是否可能将桌上物品的排列s,通过上述操作,转化为另一种排列t。

输入描述:
第一行输入一个正整数n,表示n个零件。
第二行输入一个长度为n,由不同小写字母组成的字符串s,表示初始从左到右排列的n种零件。
第三行输入一个长度为n,由不同小写字母组成的字符串t,表示Nitori希望得到的排列。

数据规范:
1≤n≤26.

  • 所有字符串保证只含有小写字母。
    输出描述:
    如果能够通过“栈”将排列s变成t,则输出"Yes",反之输出"No"。(不包含双引号,大小写任意)
    示例1
    输入

1
a
o

输出

No

示例2
输入

1
c
c

输出

Yes

示例3
输入

7
abcedfh
aecbfdh

输出

Yes

说明
如果使用u表示入栈,使用o表示出栈,则此组数据可通过操作:
uouuuooouuoouo
从s排列得到t排列。

栈的简单应用,先把字符存到push,pop两个数组里,两个指针,i,j,然第一个字符串从第i个元素开始依次进栈,如果此时栈顶元素等于pop的数组第j个元素,出栈,依次进行下去。

#include <iostream>
#include <stack>
using namespace std;
bool isPopSeries(char push[],char pop[],int length)
{
    if(!push||!pop||length<=0)
        return false;
    stack<char> temp;
    int pushNum=0;
    int i = 0;
    while(i < length)
    {
        while(temp.empty()||temp.top()!=pop[i])
        {
            if(pushNum < length)
                temp.push(push[pushNum++]);
            else
                return false;
        }
        if(!temp.empty()&&temp.top()==pop[i])
        {
            temp.pop();
            i++;
        }
    }
    return true;
}
  
int main()
{
    int n;
    char pushArray[100],popArray[100];
    cin>>n;
    getchar();
    gets(pushArray);
    gets(popArray);
    if(isPopSeries(pushArray,popArray,n))
        cout<<"Yes"<<endl;
    else
        cout<<"No"<<endl;
    system("pause");
    return 0;
}

还有这个版本的

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1e2+10;
int sum,n;
char push[maxn],pop[maxn],a[maxn],b[maxn];
bool check()
{
    int i=0,j=0;
    stack<char> mystack;
    while(i < n)
    {
        mystack.push(push[i]);
        i++;
        while(!mystack.empty() && mystack.top() == pop[j])
        {  
                mystack.pop();
                j++;   
        }
         
    }
    if( mystack.empty() && j==n)
        return true;
    return false;
}
 
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>push[i],a[i]=push[i];
    for(int i=0;i<n;i++)
        cin>>pop[i],b[i]=pop[i];
    sort(a,a+n);
    sort(b,b+n);
    for(int i=0;i<n;i++)
    {
        if(a[i]!=b[i])
        {
            cout<<"No"<<endl;
            return 0;
        }
    }
    if(check())
    cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    //system("pause");
    return 0;
 
 
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章