c++ 题目描述 给出两个序列 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。为了防止骗分,每个测试点有多组数据。 输入格式 第一行一个整数 q,询问次数。 接下来 q 个询问,对于每个询问: 第一行一个整数 n 表示序列长度; 第二行 n 个整数表示入栈序列; 第三行 n 个整数表示出栈序列; 输出格式 对于每个询问输出答案。禁止使用vector,使用stack
时间: 2024-04-15 12:27:19 浏览: 61
这道题目要求判断给定的入栈序列和出栈序列是否匹配。你可以使用一个栈来模拟入栈和出栈的过程,按照以下步骤进行判断:
1. 读取输入的询问次数 q。
2. 进入一个循环,循环 q 次,对于每个询问:
1. 读取序列长度 n。
2. 读取入栈序列 pushed。
3. 读取出栈序列 poped。
4. 创建一个栈 stack。
5. 初始化一个指针 i 和 j,分别指向入栈序列和出栈序列的第一个元素。
6. 进入一个循环,判断条件为 i < n:
1. 将 pushed[i] 入栈 stack,并将 i 自增 1。
2. 进入一个循环,判断条件为 stack 不为空且 stack 的栈顶元素等于 poped[j]:
1. 将 stack 的栈顶元素出栈。
2. 将 j 自增 1。
3. 判断条件为 j < n 且 stack 不为空,如果满足则输出 "No",并跳出循环。
7. 判断条件为 j == n 且 stack 为空,如果满足则输出 "Yes",否则输出 "No"。
下面是一个示例的 C++ 实现:
```cpp
#include <iostream>
#include <stack>
using namespace std;
int main() {
int q;
cin >> q;
while (q--) {
int n;
cin >> n;
int pushed[n];
int poped[n];
for (int i = 0; i < n; i++) {
cin >> pushed[i];
}
for (int i = 0; i < n; i++) {
cin >> poped[i];
}
stack<int> st;
int i = 0, j = 0;
while (i < n) {
st.push(pushed[i]);
i++;
while (!st.empty() && st.top() == poped[j]) {
st.pop();
j++;
}
if (j < n && st.empty()) {
cout << "No" << endl;
break;
}
}
if (j == n && st.empty()) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
```
这样就可以判断每个询问是否满足条件了。注意题目要求禁止使用 vector,所以使用了数组来存储序列。同时,使用 stack 来模拟入栈和出栈的过程。
阅读全文