zoukankan      html  css  js  c++  java
  • 栈和队列(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

  • 相关阅读:
    前端工程师基础课程作业
    对于API接口设计的几点看法
    socket socket.io
    移动端布局
    angularJS
    bootstrop的应用
    jquery基础
    html5本地存储
    ajax
    数据库类型
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/9691501.html
Copyright © 2011-2022 走看看