本专栏持续输出数据结构题目集,欢迎订阅。
题目
假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。
输入格式:
输入第一行给出两个正整数 n 和 m,其中 n 是待测序列的个数,m(≤50)是堆栈的最大容量。随后 n 行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。
输出格式:
对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。
输入样例:
4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX
输出样例:
YES
NO
NO
NO
代码
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 101
int main() {
int n, m;
char sequence[MAX_LENGTH];
// 读取测试用例数量和堆栈容量
scanf("%d %d", &n, &m);
// 处理每个测试用例
for (int i = 0; i < n; i++) {
scanf("%s", sequence);
int len = strlen(sequence);
int stack_size = 0;
int valid = 1;
// 遍历序列中的每个操作
for (int j = 0; j < len; j++) {
if (sequence[j] == 'S') {
// 入栈操作
stack_size++;
if (stack_size > m) {
valid = 0;
break;
}
} else if (sequence[j] == 'X') {
// 出栈操作
stack_size--;
if (stack_size < 0) {
valid = 0;
break;
}
}
}
// 检查最终栈是否为空
if (valid && stack_size == 0) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}
5640

被折叠的 条评论
为什么被折叠?



