蒟蒻请神犇看看这全部WA的代码

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

jiazetang @ 2023-05-21 23:50:08


#include<bits/stdc++.h>
using namespace std;

int main()
{
    int q;
    scanf("%d",&q);
    stack<int>s;
    while(q--)
    {
        int b[100010];
        int n,sing=1;
        scanf("%d",&n);

        for(int i=0;i<n;i++)
            {
                int temp;
                scanf("%d",&temp); 
                s.push(temp);
            }
        for(int i=0;i<n;i++)
                scanf("%d",&b[i]);
        /*for(int i=0;i<n;i++)
                printf("%d*",*&b[i]);*/
        for(int i=0;i<n;i++)
            {
                if(b[i]==s.top())
                    s.pop();
                else
                {
                    sing=0;
                    printf("No\n");
                    break;
                }
            }
        if(sing)
            printf("Yes\n");
    }
    return 0;
}```

by lihefan @ 2023-05-22 07:52:03

这段代码是一个模拟栈的题目,但是有一些问题:

  1. 每次循环都会重新定义一个数组b,这样会浪费空间,可以在外面定义一个固定大小的数组。

  2. 在输入b数组时,可以直接用指针或者下标的方式读入,不需要使用&*的方式。

  3. 在判断是否匹配时,如果栈为空,直接判断为不匹配即可。

  4. 在每次循环结束后,需要清空栈,否则会影响下一次循环的结果。


by xingwuKling @ 2023-06-02 21:48:29

@lihefan

#include<iostream>
#include<stack>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;

int main()
{
    int q;
    cin >> q;
    stack<int>s;
    while (q--)
    {
        bool flag = false;
        int n;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            int x;
            cin >> x;
            s.push(x);
        }
        while (!s.empty())
        {
            int x;
            cin >> x;
            if (s.top() != x)
            {
                cout << "No" << endl;
                flag = true;
                return 0;
            }
            s.pop();
        }
        if (!flag)cout << "Yes" << endl;
        if (!s.empty())//如果栈不为空,清空
        {
            while (!s.empty())
            {
                s.pop();
            }
        }
    }
    return 0;
}

我不知道错哪了,大佬能帮忙看看吗,感激不尽


by lihefan @ 2023-06-03 11:39:53

@xingwuKling 这段代码实现了一个判断多组数据中给定的序列是否为栈的弹出序列的功能。但是在判断错误的情况下,直接使用了 return 0 语句,导致程序直接结束,无法处理后续的数据。建议使用 break 语句来跳出当前循环,继续处理后续数据。另外,可以考虑将判断错误的情况和输出 "No" 的语句放在循环外部,这样可以避免在循环中多次输出 "No"。

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

const int N = 100010;
int a[N], b[N];

int main()
{
    int q;
    cin >> q;
    while (q -- )
    {
        int n;
        cin >> n;
        for (int i = 0; i < n; i ++ ) cin >> a[i];
        for (int i = 0; i < n; i ++ ) cin >> b[i];

        stack<int> stk;
        int j = 0;
        for (int i = 0; i < n; i ++ )
        {
            stk.push(a[i]);
            while (stk.size() && stk.top() == b[j])
            {
                stk.pop();
                j ++ ;
            }
        }

        if (stk.empty()) puts("Yes");
        else puts("No");
    }

    return 0;
}

by Y_QWQ_Y @ 2023-07-05 17:34:11

求大佬顺脚帮我康康

#include<bits/stdc++.h>
using namespace std;
int a[100005];
stack<int> sta;
int n,x,cnt,m;
bool flag = true;
int main(){
    cin>>m;
    for(int j=1;j<=m;j++){
        memset(a,0,sizeof(a));
        cin >> n;
        for (int i = 1; i <= n; i++)cin >> a[i];
        for (int i = 1; i <= n; i++){
            cin>>x;
            while(sta.empty()||(cnt<n&&sta.top()!=x)){
                cnt++;
                sta.push(a[cnt]);
            }
            if(!sta.empty()&&sta.top()==x)sta.pop();
            else flag=false;
        }
        if (flag)cout << "Yes\n";
        else cout << "No\n";
        while(!sta.empty())sta.pop();
    }
    return 0;
}

栓Q啦!


by Y_QWQ_Y @ 2023-07-05 17:35:36

明明样例可以过,但是却全挖了


|