洛谷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; }

浙公网安备 33010602011771号