假设以s和x分别表示入栈和出栈操作。如果根据一个仅由s和x构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入s和x序列,判断该序列是否合法。输入第一行给出两个正整数 n 和 m,其中 n 是待测序列的个数,(m<=50) 是堆栈的最大容量。随后 n 行,每行中给出一个仅由s和x构成的序列。序列保证不为空,且长度不超过 100。对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。不用开辟列表模拟栈,只用一个变量len_stack记录当前栈内元素个数: 遇到s:入栈 → len_stack += 1,立刻判断:超过栈最大容量m → 序列非法; 遇到x:出栈 → len_stack -= 1,立刻判断:栈变成负数(空栈还要出栈)→ 序列非法;2、遍历中途只要触发len_stack<0或len_stack>m,直接终止本轮循环;3、全部遍历完成后:最终栈必须为空(len_stack == 0)才合法,否则非法。SSSXXSXXSX:全程栈长 0~3≤10,无负数,最后总数相等栈空 → YESSSSXXSXXS:最后多 1 个 s,栈剩 1 个元素不为空 → NOSSSSSSSSSSXSSXXXXXXXXXXX:前面 10 个 s 已经占满容量 10,后续再加 s 超上限 → NOSSSXXSXXX:出栈数量>入栈,中途栈变负数 → NO# 读取第一行:n=待测序列数量,m=栈最大容量n, m = map(int, input().split())# 循环遍历n个待测字符串for _ in range(n): s = input().strip() # 读取当前s/x组成的操作字符串 stack_cnt = 0 # 计数器:模拟当前栈里元素数量,初始空栈0个 flag = True # 标记序列是否合法,默认合法 for ch in s: # 逐个遍历每个操作字符 if ch == 's': # s:入栈,栈元素+1 stack_cnt += 1 # 入栈后超出栈最大容量m → 非法 if stack_cnt > m: flag = False break else: # x:出栈,栈元素-1 stack_cnt -= 1 # 出栈后栈元素为负(空栈出栈)→ 非法 if stack_cnt < 0: flag = False break # 两个合法条件:中途没出错(flag=True) + 最终栈为空(stack_cnt=0) if flag and stack_cnt == 0: print("YES") else: print("NO")