汉诺塔问题的栈实现方法

汉诺塔问题的栈实现方法

汉诺塔问题,通过递归方法实现,逻辑非常清晰,但因递归的效率问题,对于盘子数量过大的情形,会递归报错,使用栈实现汉诺塔问题,会有所改进,实现的思路,有助于理解和使用栈来解决类似的递归问题。

使用栈实现步骤的模板:

​ 1、建立任务栈和输出栈,

​ 2、建立初始任务记录,将任务记录压入任务栈,

​ 3、对任务栈进行出栈操作来完成任务,完成任务的动作压入输出栈

对不同的问题,在出栈操作时进行处理,要根据问题要求和出栈的数据,直接处理或分解后继续压入栈,直至任务栈清空。

python 实现代码如下:

class my_stack:

    def __init__(self,number):
        self.__stack = []
        i = 0
        while i < number:
            self.__stack.append(number - i)
            i = i+1

    def pop(self):
        if len(self.__stack) > 0:
            return self.__stack.pop()
        else:
            return None

    def push(self,tmp):
        self.__stack.append(tmp)

    def get_first(self):

        if len(self.__stack) > 0:
            return self.__stack[0]
        else:
            return None

    def get_last(self):

        if len(self.__stack) > 0:
            return self.__stack[len(self.__stack)-1]
        else:
            return None

    def print(self):
        i = 0
        while i < len(self.__stack):
            print('第'+str(i+1)+'条记录: ',self.__stack[i])
            i = i + 1

    def print_number(self):
        print(len(self.__stack))

    def get_number(self):
        return len(self.__stack)


def hanoi_stack_e(n):
    
    task_stack = my_stack(0)
    out_stack = my_stack(0)
    
    task_stack.push((n, 'smd'))

    while task_stack.get_last() != None:
        a_tmp = task_stack.pop()
        if a_tmp[0] > 1:
            b_tmp_l = (a_tmp[0]-1,a_tmp[1][1]+a_tmp[1][0]+a_tmp[1][2])
            b_tmp_m = (1,a_tmp[1])
            b_tmp_f =(a_tmp[0]-1,a_tmp[1][0]+a_tmp[1][2]+a_tmp[1][1])
            task_stack.push(b_tmp_l)
            task_stack.push(b_tmp_m)
            task_stack.push(b_tmp_f)
        else:
            out_stack.push(a_tmp)
            
return out_stack



#测试
n = 3
out_e = hanoi_stack_e(n)
out_e.print()

其中:

1、压入任务栈中的任务记录为一元组数据,n为盘子的数量,字符串’smd’表示从起始柱(s)通过中间柱(m)移至目标柱(d),

2、输出栈中的记录为一元组数据,为完成任务的操作记录,1,表示移动一个盘子,‘smd’表示从将1个盘子从起始柱(s)通过中间柱(m)移至目标柱(d),

3、其它递归问题,也可以据此思路通过栈来实现。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值