博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

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

题目描述

给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。

输入格式

第一行一个整数 q,询问次数。

接下来 q 个询问,对于每个询问:

第一行一个整数 n 表示序列长度;

第二行 n 个整数表示入栈序列;

第二行 n 个整数表示出栈序列;

输出格式

对于每个询问输出答案。

输入输出样例

输入 #1
2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3
输出 #1
Yes
No
好像显示不全,题目链接:https://www.luogu.com.cn/problem/P4387
蒟蒟蒟蒻的第一篇题解
思路:
poped序列是固定的,存到队列里;
因为入栈顺序不是确定的,所以先把pushed序列存到数组里,之后再进行入栈出栈操作。
通过循环判断队列的队头和栈顶元素是否相等来进行 将数组元素入栈(不等)出队列、出栈(相等) 操作
若队列最终为空,则输出Yes;若数组元素已全部入栈,同时无法按poped序列出栈,则退出循环。此时队列和栈都不为空,输出No。
在栈中预先push一个0;亲测不push(0)会出异常
#include <iostream>
#include<deque>
#include<stack>
#define MAX 100005
using namespace std;
int a[MAX];
int main()
{
    stack<int>st;
    deque<int>de;
    int n, m, i, x;
    bool flag = false;
    cin >> n;
    while (n--)
    {
        cin >> m;
        for (i = 0; i < m; i++)
        {
            cin >> a[i];
        }
        for (i = 0; i < m; i++)
        {
            cin >> x;
            de.push_back(x);
        }
        i = 0; st.push(0);//这里的st.push(0);是为了st.top(),亲测去掉会出异常
        while (de.empty()==false)
        {
            flag = false;
            if (de.front() != st.top()&&i!=m)
            {
                st.push(a[i]);
                i++;
                flag = true;
            }
            else if(de.front() == st.top())
            {
                st.pop();
                de.pop_front();
                flag = true;
            }
            if (flag == false) break;//flag用于判断if和else if是否执行过,都未执行意味着此时序列已经全部入栈,无法再继续入栈操作;而栈顶元素和队头元素不等,无法进行出栈操作,再继续循环下去也无法入栈和出栈,说明该序列不符合要求,应该输出"No"。
        }
        
        if (flag) //或者if(de.empty()==false)
            cout << "Yes\n";
        else 
            cout << "No\n";
        //清空栈和队列
        de.clear();
        while (st.empty()==false)
        {
            st.pop();
        }
    }
    return 0;
}

 

posted @ 2020-04-28 15:54  0le1ukOie  阅读(627)  评论(0)    收藏  举报