问题描述:
不采用额外的数据结构(例如数组,队列,栈等),逆序一个栈。
输入: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)
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]
总结:
虽然不可使使用额外的数据结构,但是函数调用本身也是一个栈,利用递归函数调用栈来保存数据。