什么模式用于动作队列?

What pattern to use for a queue of actions?

我正在编写一个“bot”,它将有一个预定义动作列表,并且在处理每个动作时,动作代码将能够将更多动作添加到队列中,作为接下来要处理的东西(不是最后)。

假设我将以动作 A、B 和 C 开始队列,在处理 B 时它添加需要在 C 之前处理的 B1 和 B2。将处理动作的最终顺序保留为 A B B1 B2 C。

普通的 FIFO 队列不会削减它,因为项目只能添加到队列的末尾。

我相信普通的后进先出堆栈也不会做。

对于这种情况,您会使用什么?

我会使用某种树。

首先它进入A。检查A是否有任何叶子,如果没有则移动到B。 在 B 中,它执行 B,然后检查是否有叶子。查找 B1 和 B2。执行 B1 并检查 B1 是否有叶子。找不到任何叶子。做B2。检查 B2 是否有叶子。找到 none。 是否 C

您可以随时将进程添加为叶子,并且应该适用于您的机器人

您还可以使用链表,其中每个进程都是一个节点并指向下一个进程。可以轻松地将 B1 添加为下一个进程,将 B2 作为其下一个进程,然后将 C 添加为 B2 的下一个进程。

您可以使用数组,只需将任务添加到前面 (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