m0_74158882 2022-12-27 11:30 采纳率: 42.9%
浏览 55
已结题

python汉诺塔堆栈(ListStack)实现

汉诺塔问题用递归实现非常简单,但是如何把递归转换成栈(stack)
请用ListStack解法
附上测试方法


if __name__ == '__main__':
    n = 3
    result_list = HanoiTower(n)
    for item in result_list:
        print(item)

附上输出格式

img

  • 写回答

3条回答 默认 最新

  • ShowMeAI 2022-12-27 11:39
    关注

    使用栈(stack)解决汉诺塔问题,可以记录每一步的状态,并将其压入栈中。当需要移动盘子时,再从栈中弹出状态,然后执行这一步。

    • 使用一个状态类来存储每一步的状态。这个类应该包含源柱子,辅助柱子和目标柱子的名称。
    • 使用一个ListStack类来存储每一步的状态。在每次移动盘子时,我们可以将新的状态压入栈中。

    下面是使用ListStack类解决汉诺塔问题的代码,以及测试用例,望采纳:

    class ListStack:
        def __init__(self):
            self.items = []
        
        def push(self, item):
            self.items.append(item)
        
        def pop(self):
            return self.items.pop()
        
        def is_empty(self):
            return self.items == []
        
        def peek(self):
            return self.items[-1]
        
    def HanoiTower(n, from_rod ='A', aux_rod ='B', to_rod ='C'):
        result_list = []
        stack = ListStack()
        stack.push((n, from_rod, aux_rod, to_rod))
        while not stack.is_empty():
            n, from_rod, aux_rod, to_rod = stack.pop()
            if n == 1:
                result_list.append(f"{from_rod} --> {to_rod}")
            else:
                stack.push((n-1, aux_rod, from_rod, to_rod))
                stack.push((1, from_rod, aux_rod, to_rod))
                stack.push((n-1, to_rod, aux_rod, from_rod))
        return result_list
    
    if __name__ == '__main__':
        n = 3
        result_list = HanoiTower(n)
        for item in result_list:
            print(item)
    

    运行结果截图如下:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月4日
  • 已采纳回答 12月27日
  • 修改了问题 12月27日
  • 修改了问题 12月27日
  • 展开全部