题目描述
给定两个整数 N
和 M
,N
代表需要判断的操作个数,M
代表堆栈的容量。接着输入 N
个堆栈的操作,S
代表入栈,X
代表出栈,每行输入一个字符串,判断每次操作是否合法。
例如:
- 如果在栈为空的时候执行出栈操作,则操作不合法。
- 如果栈的大小超过容量
M
,则操作不合法。
题解
为了判断堆栈操作的合法性,我们可以使用 C++ 编写一个程序来完成。主要的思路是:
- 使用一个栈来模拟堆栈操作。
- 遍历所有操作,根据操作类型进行入栈或出栈,并在每一步检查操作是否合法。
以下是完整的 C++ 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <iostream> #include <stack> #include <string> #include <vector> using namespace std;
bool isValidStackOperations(int M, const string& operations) { stack<int> stk; for (char op : operations) { if (op == 's') { if (stk.size() >= M) { return false; } stk.push(1); } else if (op == 'x') { if (stk.empty()) { return false; } stk.pop(); } else { return false; } } return true; }
int main() { int N, M; cout << "请输入操作序列的个数N和堆栈容量M: "; cin >> N >> M; cin.ignore();
vector<string> allOperations(N);
for (int i = 0; i < N; ++i) { cout << "请输入操作字符串: "; getline(cin, allOperations[i]); }
for (string operations : allOperations) { if (isValidStackOperations(M, operations)) { cout << "操作合法" << endl; } else { cout << "操作不合法" << endl; } }
return 0; }
|
示例1
输入:
输出:
1 2 3 4 5
| 请输入操作序列的个数N和堆栈容量M: 2 3 请输入操作字符串: ssxxs 请输入操作字符串: sxsxsxssxxsss 操作合法 操作不合法
|