【问题标题】:What pattern to use for a queue of actions?用于操作队列的模式是什么?
【发布时间】:2020-08-10 16:52:11
【问题描述】:
我正在编写一个“机器人”,它将有一个预定义动作列表,并且在处理每个动作时,动作代码将能够将更多动作添加到队列中,作为接下来要处理的事情(不在结束)。
假设我将从动作 A、B 和 C 开始队列,在处理 B 时,它会在 C 之前添加需要处理的 B1 和 B2。将已处理动作的最终顺序保留为 A B B1 B2 C。
普通的 FIFO 队列不会削减它,因为项目只能添加到队列的末尾。
我相信,普通的 LIFO 堆栈也不行。
你会在这个场景中使用什么?
【问题讨论】:
标签:
ruby
parallel-processing
queue
【解决方案1】:
您可以使用数组,只需将任务添加到前面 (unshift) 并从前面获取任务 (shift)
queue = ["A", "B", "C"]
def process_next_step(queue)
puts "Tasks are #{queue}"
task = queue.shift
puts "Current task is #{task}"
if task == "B"
puts "adding subtasks"
queue.unshift("B1")
queue.unshift("B2")
else
puts "Doing #{task}"
end
end
while !queue.empty?
process_next_step(queue)
end
这会产生
Tasks are ["A", "B", "C"]
Current task is A
Doing A
Tasks are ["B", "C"]
Current task is B
adding subtasks
Tasks are ["B2", "B1", "C"]
Current task is B2
Doing B2
Tasks are ["B1", "C"]
Current task is B1
Doing B1
Tasks are ["C"]
Current task is C
Doing C
【解决方案2】:
我会使用某种树。
首先它进入A。如果A没有移动到B,则检查A是否有任何叶子。
在 B 它做 B 然后检查是否有任何叶子。查找 B1 和 B2。做 B1 并检查 B1 是否有叶子。没有找到叶子。做B2。检查 B2 是否有叶子。没有找到。
有没有C
您可以随时将进程添加为叶子,并且应该适用于您的机器人
您还可以使用链表,其中每个进程都是一个节点并指向下一个进程。可以轻松地将 B1 添加为下一个进程,将 B2 作为下一个进程,然后将 C 作为 B2 的下一个进程。