首页 > 试题广场 >

用递归函数和栈逆序一个栈

[编程题]用递归函数和栈逆序一个栈
  • 热度指数:8460 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。

输入描述:
输入数据第一行一个整数N为栈中元素的个数。

接下来一行N个整数X_i表示一个栈依次压入的每个元素。


输出描述:
输出一行表示栈中元素逆序后的栈顶到栈底的每个元素
示例1

输入

5
1 2 3 4 5

输出

1 2 3 4 5

来一个python能全部跑通的版本


注意: python 的recursion有次数限制, 默认的是1000, 但此处的测试用例的最后一个输入了1500多个数字, 所以要改变默认的限制, 这里保险设置成了2000.

​
​
​import sys
# python has a recurision limitation
# default is 1000
sys.setrecursionlimit(2000)

def getLastRemove(stack): 

    res = stack.pop()
    if len(stack) == 0:
        return res
    last = getLastRemove(stack)
    stack.append(res)
    return last

def reverse(stack): 
    if len(stack) == 0:
        return None
    i = getLastRemove(stack)
    reverse(stack)
    stack.append(i)
    return None

stack = []
N = int(input())

a = input()
for i in a.split():
    stack.append(int(i))

reverse(stack)

s=""

for i in range(N):
    s+= str(stack.pop())
    if i < N-1:
        s+= " "
print(s)

发表于 2022-12-11 17:35:56 回复(0)
牛客的题真的有些有点搞笑,90%,实在不知道哪错了
# 只用递归函数逆序栈
import sys
from collections import deque

'''
栈只能获取顶部,pop, push
'''

def get_and_remove_botton_ele(stack:deque)->int:
    result = stack.pop()
    if not stack:
        return result
    else:
        last = get_and_remove_botton_ele(stack)
        stack.append(result)
        return last

def reverse(stack:deque):
    if not stack:
        return
    else:
        e = get_and_remove_botton_ele(stack)
        reverse(stack)
        stack.append(e)

n = int(sys.stdin.readline().strip())
x = sys.stdin.readline().strip().split()

stack = deque(map(int, x[::-1]))
reverse(stack)

for i in range(n):
    print(stack.pop(), end=' ')


发表于 2020-07-07 00:02:08 回复(0)
有毒的一道题,要用递归逆序一个栈,但是输入与输出顺序相反,那我还逆序干嘛,直接全部进栈,再全部出栈,不就行了。
此外使用python,一直卡在90%的测试用例点上,考试模式也不提示错误用例,唉,真的难受。
import sys
from collections import deque

def pop_bottom(stack):
    if len(stack) == 1:
        return stack.pop()
    num = stack.pop()
    res = pop_bottom(stack)
    stack.append(num)
    return res


def reverse(stack):
    if stack is None or len(stack) == 0:
        return
    num = pop_bottom(stack)
    reverse(stack)
    stack.append(num)


N = int(sys.stdin.readline().strip())
nums = [int(i) for i in sys.stdin.readline().strip().split()]
stack = deque()
for num in nums:
    stack.append(num)
reverse(stack)
while len(stack) > 0:
    print(stack.popleft(), end=' ')


发表于 2019-10-17 23:56:41 回复(0)
def reverse(l):
    if not l:
        return ''
    return l[-1]+' '+reverse(l[:-1])

n = int(input())
l = input().strip().split()
print(reverse(l))

超简洁。但是跟另一位Python的兄弟一样,90%,不知道什么问题。
编辑于 2019-10-12 11:11:40 回复(0)