栈的反转
实现栈的逆序,但是只能使用递归函数和栈本身的pop操作。
解法:
首先定义一个get
方法,该方法用于将栈底的元素取出并返回。然后定义reverseStack
方法,在该方法中,首先取出栈底元素,然后对移除栈底元素的栈递归调用reverseStack
方法,直到栈为空,返回。返回后,将取出的栈底元素一次入栈,这样的话,最后一次取出的栈底元素(实际的栈顶元素)就落在了栈底,从而实现了栈的逆序。
def get(stack):
# 先弹出栈顶元素
item = stack.pop()
# 若此时栈为空,说明栈顶元素为原先的栈底元素,直接返回它
if stack == []:
return item
else:
# 递归调用get方法,获取栈底元素
last = get(stack)
# 将弹出的元素依次入栈
stack.append(item)
return last
def reverseStack(stack):
if stack == []:
return
# 弹出栈底元素
bottom_item = get(stack)
# 递归调用反转方法,不断地弹出栈底元素
reverseStack(stack)
# 将栈底元素入栈
stack.append(bottom_item)
return stack
栈的排序
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
解法:
定义一个辅助栈,设法将辅助栈的元素按降序排列。首先弹出待排序的栈的栈顶元素,记为current
,若辅助栈为空,直接将其压入辅助栈,若辅助栈不为空,且current
小于等于辅助栈的栈顶元素,也将其压入辅助栈。如果辅助栈不为空,且current
大于辅助栈的栈顶元素,则将辅助栈的栈顶元素不断地压入原始栈中,直到满足current
小于等于辅助栈栈顶元素或辅助栈为空。
这个过程的结束条件是原始栈的所有元素都被压入至辅助栈中,具体代码如下。
def stackSort(stack):
help_stack = []
# 循环条件
while stack != []:
# 弹出栈顶元素
current = stack.pop()
# 若辅助栈不为空,且current大于辅助栈的栈顶元素,将辅助栈的元素依次压入原始栈中
while help_stack != [] and current > help_stack[-1]:
stack.append(help_stack.pop())
# 此时current必小于辅助栈栈顶或辅助栈为空,current直接压入辅助栈即可
help_stack.append(current)
# 将辅助栈的元素依次压入原始栈,完成升序排序
for i in range(len(help_stack)):
stack.append(help_stack.pop())
return stack