过了样例,一个测试点都过不去

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

Gril @ 2022-10-16 06:51:18

代码如下

#include<bits/stdc++.h>
#define Y "Yes"
#define N "No"
using namespace std;
int q;
int main()
{
    //s1输入,s3目标结果,s2中间栈
    stack<int> s1,s2,s3;
    cin >> q;
    for(int i = 1;i <= q;i++)
    {
        int n = 0;
        cin >> n;
        for(int j = 1; j <= n;j++)
        {
            int t = 0;
            cin >> t;
            s1.push(t);
        }
        for(int j = 1;j <= n;j++)
        {
            int t = 0;
            cin >> t;
            s3.push(t);
        }
        while(1)
        {
            //目标结果栈为空则成功
            if(s3.empty()){ cout << Y << endl; break; }
            int t = 0;
            if(!s1.empty())
            {
                t = s1.top();
                s2.push(s1.top());
                s1.pop();
            }
            if(!s2.empty())
            {
                if(s1.empty())
                {
                    //若输入栈空,中间栈顶不等于目标栈顶,就等于失败了
                    if(s2.top() != s3.top())
                    {
                        cout << N << endl;
                        break;
                    }
                }
                if(s2.top() == s3.top())
                {
                    s3.pop();
                    s2.pop();
                }
            }
        }
    }
    return 0;
}

by Gril @ 2022-10-16 06:53:39

我觉得我思路没问题


by Gril @ 2022-10-16 07:13:39

思路就是通过一个中间栈,然后不断把s1(输入栈)栈顶元素pop,把它push进s2(中间栈),然后判断s2的top和s3的top是否相同,相同就两个一起pop(删除栈顶元素)。直到s3为空则"Yes"。当s1为空可s2和s3的栈顶不同为"No"。


by Ted_Algorithm @ 2022-11-04 14:49:39

你试下这组hack数组,大概就会知道你的思路问题出在哪里了

/*
1
5
1 2 3 4 5
3 2 1 5 4
*/

|