• 栈和队列(2)----排序


    一、题目:仅用递归函数和栈操作逆序一个栈

    将一个栈里面的元素逆序,只能用递归函数来实现,不能用其他数据结构。

    1. 只能用递归函数来实现
    2. 可以使用现成的栈类型

    思路:

    为了将栈逆序,只需要按顺序将栈顶至栈底的元素拿出并移除,放置到栈顶中,这样就可以将栈逆序。

    两个递归函数

    一个将栈底元素取出。

    一个将剩下的栈元素逆序。

    如:

    输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。

    // 我们再来考虑怎么递归。我们把栈{1, 2, 3, 4, 5}看成由两部分组成:栈顶元素1和剩下的部分{2, 3, 4, 5}。如果我们能把{2, 3, 4, 5}颠倒过来,变成{5, 4, 3, 2},然后在把原来的栈顶元素1放到底部,那么就整个栈就颠倒过来了,变成 {5, 4, 3, 2, 1}。

    // 接下来我们需要考虑两件事情:一是如何把{2, 3, 4, 5}颠倒过来变成{5, 4, 3, 2}。我们只要把{2, 3, 4, 5}看成由两部分组成:栈顶元素2和剩下的部分{3, 4, 5}。

    // 我们只要把{3, 4, 5}先颠倒过来变成{5, 4, 3},然后再把之前的栈顶元素2放到最底部,也就变成了{5, 4, 3, 2}。
    // 至于怎么把{3, 4, 5}颠倒过来……这就是递归。也就是每一次试图颠倒一个栈的时候,现在栈顶元素pop出来,
    // 再颠倒剩下的元素组成的栈,最后把之前的栈顶元素放到剩下元素组成的栈的底部。递归结束的条件是剩下的栈已经空了

    代码:

    import queue
    stack = queue.LifoQueue()
    for i in range(1,6):
        stack.put(i)
    
    #第一个取出栈底元素的递归函数
    def getLast(stack):
        if stack.empty():
            return
        result = stack.get()
        if stack.empty():
            return result
        else:
            last = getLast(stack)
            stack.put(result)
            return last
    #第二个递归,逆序  
    def reverse(stack):
        if stack.empty():
            return 
        last = getLast(stack)
        reverse(stack)
        stack.put(last)
    # print(stack.empty)
    reverse(stack)

     


    二、题目:用一个栈实现另一个栈的排序

    一个栈中元素的类型为整型,若将栈从顶到底按从大到小的顺序排序,只许申请一个栈。可以申请新的变量,但不能申请额外的数据结构。

    思路:

    代码:

    def getFirst(stack):
        first = stack.get()
        stack.put(first)
        return first
    
    def sortstack(stack):
        if stack.empty():
            return 
        helper = queue.LifoQueue()
        while not stack.empty():
            cur = stack.get()    
            
            while not helper.empty() and getFirst(helper) < cur:
                stack.put(helper.get())
            helper.put(cur)
        while not helper.empty():
            stack.put(helper.get())
        return stack

  • 相关阅读:
    codeforces 869E. The Untended Antiquity(二维树状数组,随机化)
    bzoj 3083: 遥远的国度(树上换根操作,树剖+询问整个子树)
    hdu 5534 Partial Tree(dp+降唯,好题)
    AtCoder Regular Contest 075 E
    hihocoder 1387 A Research on "The Hundred Family Surnames"(树,lca,求同一颜色的直径)
    hdu 5458 Stability(生成树,树链剖分,好题)
    推荐一套个人ui组件库
    回望2019,期盼2020
    如何从产品的角度对待自己的博客
    致一名迷茫的我
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/9691501.html
Copyright © 2020-2023  润新知