题目
求解规定序列能否由入栈出栈操作得到
输入:
有若干组数据输入
每组数据中,第一行为两个个整数 n 和 m。n 表示需要依次从 1~n 入栈,m 表示这组数据有 m 个出栈序列需要判断,当 n=0 且 m=0 时停止。
接下来有行,每行表示一个出栈序列
输出:
对每一个出栈序列,如果能正常出栈,输出Yes,否则输出 No。
sample:
input:
5 2
1 2 3 4 5
5 4 1 2 3
6 1
6 5 4 3 2 1
0 0
output:
Yes
No
Yes
C++完整代码
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
bool isPossibleSeq(int n, const vector<int>& sequence) {
stack<int> st; // 创建一个辅助栈,用于模拟入栈和出栈的操作
int num = 1; // 下一个要入栈的数字,初始值为1
for (int i = 0; i < sequence.size(); i++) {
while (st.empty() || st.top() != sequence[i]) { // 如果栈为空或栈顶元素不等于当前要出栈的元素
if (num > n) // 如果数字已经大于总共需要入栈的数字个数,说明无法满足出栈序列,返回false
return false;
st.push(num); // 数字入栈
num++; // 下一个要入栈的数字递增
}
st.pop(); // 栈顶元素和当前要出栈的元素相等,模拟一个元素出栈的操作
}
return true; // 所有的出栈序列都符合合法的入栈和出栈操作,返回true
}
int main() {
int n, m;
cin >> n >> m;
while ( n != 0 && m != 0) {
for (int i = 0; i < m; i++) {
vector<int> sequence(n);
for (int j = 0; j < n; j++)
cin >> sequence[j];
if (isPossibleSeq(n, sequence))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
if (cin >> n >> m && n != 0 && m != 0) cout << endl;
}
return 0;
}