不使用额外的数据结构,逆序一个栈

问题描述:
不采用额外的数据结构(例如数组,队列,栈等),逆序一个栈。
输入:Stack[K1, K2, ... Kn], K1为栈底元素,Kn为栈顶元素。
输出:Stack[Kn, Kn-1, ..., K1]

算法描述:
逆序一个栈Stack[K1, K2, ..., Kn],采用递归分治的思想:
STEP 1: 取出栈底元素K1,修改栈为Stack[K2, K3, ..., Kn]
STEP 2: 逆序栈Stack[K2, K3, ..., Kn],得到Stack[Kn, Kn-1, K2],
STEP 3: 将K1压栈,得到Stack[Kn, Kn-1, ..., K1]

采用python描述算法:
getBottom函数完成STEP1,reverseStack依据上述递归思想完成逆序。
getBottom函数本身也为递归函数。

Stack的操作包括:
1)Stack = [], 初始化一个空栈。
2)Stack.push(k),元素压栈(python描述为Stack.append(k))。
3)k = Stack.pop(),栈顶元素出栈。
4)Stack == [], 判断Stack是否为空。

代码如下:
def getBottom(stack):
    a = stack.pop()
    if (stack == []):
        return a
    else:
      b = getBottom(stack)
      stack.append(a)
      return b
       
def reverseStack(stack):
    if (stack == []):
        return;
    else:
        bottom = getBottom(stack)
        reverseStack(stack)
        stack.append(bottom)
        return;

s = [1, 2, 3, 4, 5]
reverseStack(s)
print s                   # s变为[5, 4, 3, 2, 1]

总结:
虽然不可使使用额外的数据结构,但是函数调用本身也是一个栈,利用递归函数调用栈来保存数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值