问题描述
小F在观察火车驶入和驶出休息区的顺序时,注意到休息区的结构类似于栈,即遵循先进后出的规则。她记 录了火车驶入和驶出的顺序,并希望验证这些顺序是否可能实际发生。火车在进入休息区后可以按顺序驶入 或停留,然后根据休息区的规则依次驶出。你的任务是帮助小F验证所记录的火车驶入和驶出顺序是否能够 被满足。
例如:如果火车的驶入顺序是123,驶出顺序是3 2 1,这是可能的;如果驶出顺序是3 1 2,则是不 可能的。 这是一个典型的栈操作模拟问题,可以用栈的特性来验证给定的火车进站和出站顺序是否可行。我们通过模拟火车的进出站过程来解决问题。
解题思路
-
用栈模拟火车进站出站:
- 将火车按顺序从
a中依次“进栈”。 - 每次将栈顶的火车与
b中的当前出站顺序进行对比。 - 如果相同,栈顶出栈,并移动出站顺序指针;如果不同,则继续将下一列火车进栈。
- 将火车按顺序从
-
验证条件:
- 如果最终能按照出站顺序
b完全出栈,则说明该出站顺序是可行的; - 如果无法完成操作,则说明顺序不可行。
- 如果最终能按照出站顺序
-
核心规则:
- 栈遵循“后进先出”,即只有栈顶的火车可以出站。
- 必须严格按照给定顺序进行模拟。
以下是实现代码:
def solution(n: int, a: list, b: list) -> bool:
stack = []
index = 0 # 指向出站序列 b 的当前元素
# 遍历进站序列 a
for train in a:
stack.append(train) # 火车进栈
# 当栈顶元素和当前出站顺序相同时,出栈
while stack and stack[-1] == b[index]:
stack.pop()
index += 1 # 移动到下一个出站元素
# 如果栈为空,说明可以匹配出站顺序
return len(stack) == 0
# 测试样例
if __name__ == '__main__':
print(solution(3, [1, 2, 3], [1, 2, 3]) == True) # 样例1
print(solution(3, [1, 2, 3], [3, 2, 1]) == True) # 样例2
print(solution(3, [1, 2, 3], [3, 1, 2]) == False) # 样例3
代码运行逻辑
-
将每一列火车从
a中依次入栈。 -
如果栈顶火车与
b中的当前出站顺序相同,则将其弹出。 -
最终检查栈是否为空:
- 如果为空,则表示所有火车都按照顺序成功出栈,返回
True。 - 如果不为空,则表示存在无法匹配的火车顺序,返回
False。
- 如果为空,则表示所有火车都按照顺序成功出栈,返回