当前位置:首页>python>python 每周一练 精选题(三十五) 栈操作序列合法性判断

python 每周一练 精选题(三十五) 栈操作序列合法性判断

  • 2026-10-11 05:57:17
python 每周一练 精选题(三十五) 栈操作序列合法性判断
题目:
假设以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
解题思路
不用开辟列表模拟栈,只用一个变量len_stack记录当前栈内元素个数:
1、遍历字符串每个字符:
     遇到s:入栈 → len_stack += 1,立刻判断:超过栈最大容量m → 序列非法;
     遇到x:出栈 → len_stack -= 1,立刻判断:栈变成负数(空栈还要出栈)→ 序列非法;
2、遍历中途只要触发len_stack<0或len_stack>m,直接终止本轮循环;
3、全部遍历完成后:最终栈必须为空(len_stack == 0)才合法,否则非法。
逐个拆解样例
SSSXXSXXSX:全程栈长 0~3≤10,无负数,最后总数相等栈空 → YES
SSSXXSXXS:最后多 1 个 s,栈剩 1 个元素不为空 → NO
SSSSSSSSSSXSSXXXXXXXXXXX:前面 10 个 s 已经占满容量 10,后续再加 s 超上限 → NO
SSSXXSXXX:出栈数量>入栈,中途栈变负数 → 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")

最新文章

随机文章