20分玄关

P4387 【深基15.习9】验证栈序列

wangxzx @ 2024-05-31 20:08:50

代码如下

#include<bits/stdc++.h>
using namespace std;
int q,n,a[100001],x;
stack<int> s;
int main()
{
    cin>>q;
    for(int e=1;e<=q;e++)
    {
        n=x;
        if(e==1)
        {
            cin>>n;
        }
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n;i++)
        {
            if(i==1)
            {
                cin>>x;
            }
            s.push(a[i]);
            while(!s.empty() && s.top()==x)
            {
                //cout<<s.top()<<endl;
                s.pop();
                cin>>x;
            }
        }
        if(s.empty())
        {
            cout<<"Yes"<<endl;
        }
        else
        {
            cout<<"No"<<endl;
            for(int i=1;i<=s.size();i++)
            {
                s.pop();
            }
        }
    }
    return 0;
}

by Tiffake @ 2024-05-31 20:47:23

@wangxzx 为什么是 n=x n 不应该输入吗


by Tiffake @ 2024-05-31 20:54:38

@wangxzx 而且你这样写输入不一定输入完。
当如果栈不空,就输入不完:

if(i==1)
{
    cin>>x;
}
s.push(a[i]);
while(!s.empty() && s.top()==x)
{
    s.pop();
    cin>>x;
}

by Tiffake @ 2024-05-31 20:57:02

@wangxzx 解决方法也很简单,先输入完再判断即可。
核心代码:

cin>>n;
for(int i=1;i<=n;i++)
{
    cin>>a[i];
}
for(int i=1;i<=n;i++)
{
    cin>>x[i];
}
for(int i=1,j=1;i<=n;i++){
    s.push(a[i]);
    while(!s.empty() && s.top()==x[j])
    {
        s.pop();
        j++;
    }
}

by ssssbbbbbb @ 2024-05-31 21:10:08

@Tiffake 为什么删除后要j++?


by ssssbbbbbb @ 2024-05-31 21:12:56

@Tiffake 改完好像还是有问题吧?


by Tiffake @ 2024-05-31 21:14:15

@ssssbbbbbb j 是数组 x 的下标,j++ 之后就是下一个这个栈应该弹出的数,与实际的栈顶判断即可


by ssssbbbbbb @ 2024-05-31 21:18:09

@Tiffake 你给的代码第三个循环似乎手误打错了


by SX114514 @ 2024-05-31 21:18:48

#include<iostream>
#include<stack>
using namespace std;
stack<int>q;
int p,n;
int main()
{
    cin>>p;
    while(p--)
    {
        cin>>n;
        int a[n+1],b[n+1],sum=1;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        for(int i=1;i<=n;i++)
        cin>>b[i];
        for(int i=1;i<=n;i++)
        {
            q.push(a[i]);
            while((q.top())==b[sum]) 
            {
                q.pop(),sum++;
                if(q.empty())break;
            }
        }
        if(q.empty()) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
        while(!q.empty())q.pop();
    }
    return 0;
}

by Tiffake @ 2024-05-31 21:19:02

@ssssbbbbbb 还有清空时栈不空就一直弹。

        if(s.empty())
        {
            cout<<"Yes"<<endl;
        }
        else
        {
            cout<<"No"<<endl;
            while(!s.empty())
            {
                s.pop();
            }
        }
    }
    return 0;
}

by ssssbbbbbb @ 2024-05-31 21:20:44

@Tiffake 中途不行就可以直接break了吧?


| 下一页