Interview100-66 颠倒一个栈

题目

用递归颠倒一个栈,例如输入栈[1,2,3,4,5],1在栈顶,颠倒之后的栈为[5,4,3,2,1],5在栈顶。

解法

1. 一种比较简单的做法是,使用一个辅助数组,将原始栈中的元素依次出栈,顺序存储到数组中,然后遍历数组中的元素进行入栈,这样就完成了栈的颠倒。但这样需要一个辅助的数组,且没有使用递归的特性。

2. 使用递归。将原始栈的颠倒分为两个步骤:(1)栈顶元素放到栈底,(2)然后反转剩余的元素,即可完成栈的反转。如何实现这两个步骤?

先看第二个步骤,它是对除栈顶元素之外的栈进行颠倒,与对原始栈的颠倒步骤一样,是递归。再看第(1)个步骤,当需要将栈顶元素放置到栈底时,如果栈为空则直接放置,如果栈中有其他元素,则其他元素出栈后,放置栈顶元素,然后在将出栈的元素按照相反的顺序放置到栈中。这样看来这个步骤中应该需要一个辅助的栈,但这里可以使用递归中默认维护的一个递归栈进行。

REVERSE-STACK(Stack stack):
    if stack.size == 1:
        return stack;
    int top_num = stack.pop(); // 栈顶元素出栈
    REVERSE-STACK(stack); // 颠倒剩余的栈
    PUT-TO-BOTTOM(stack, top_num ); // 栈顶元素放置到栈底

PUT-TO-BOTTOM(Stack stack, int top_num):
    if stack.isEmpty(): // 如果栈为空,直接放置到栈底
        stack.push(top_num);
        return;
    int other = stack.pop(); // 其他元素出栈
    PUT-TO-BUTTOM(stack, top_num); // 栈顶元素放置到栈底
    stack.push(other); // 其他元素返回栈中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值