c++ 题目描述 给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。 输入格式 第一行一个整数 q,询问次数。 接下来 q 个询问,对于每个询问: 第一行一个整数 n 表示序列长度; 第二行 n 个整数表示入栈序列; 第三行 n 个整数表示出栈序列; 输出格式 对于每个询问输出答案。
时间: 2024-04-15 12:27:19 浏览: 102
题目描述中给出了两个序列pushed和poped,分别表示入栈和出栈的序列。题目要求判断给定的出栈序列是否可能是由对应的入栈序列执行出栈操作得到的。
解决这个问题的思路可以使用模拟栈的方式。我们遍历入栈序列,将元素依次入栈,并在每次入栈后检查栈顶元素是否与当前出栈序列的第一个元素相等。如果相等,则将栈顶元素出栈,并将出栈序列的指针向后移动一位。最后,如果栈为空,则说明出栈序列是由对应的入栈序列执行出栈操作得到的。
下面是C++代码实现:
```cpp
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> st;
int n = pushed.size();
int j = 0; // 出栈序列指针
for (int i = 0; i < n; i++) {
st.push(pushed[i]);
while (!st.empty() && st.top() == popped[j]) {
st.pop();
j++;
}
}
return st.empty();
}
int main() {
int q; // 询问次数
cin >> q;
while (q--) {
int n; // 序列长度
cin >> n;
vector<int> pushed(n);
vector<int> popped(n);
for (int i = 0; i < n; i++) {
cin >> pushed[i];
}
for (int i = 0; i < n; i++) {
cin >> popped[i];
}
if (validateStackSequences(pushed, popped)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
```
这段代码中,我们使用了一个栈st来模拟入栈和出栈的过程。遍历入栈序列pushed,将元素依次入栈,并在每次入栈后检查栈顶元素是否与当前出栈序列popped的第一个元素相等。如果相等,则将栈顶元素出栈,并将出栈序列的指针向后移动一位。最后,如果栈为空,则说明出栈序列是由对应的入栈序列执行出栈操作得到的。
阅读全文