栈和队列

Posted lee-yl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈和队列相关的知识,希望对你有一定的参考价值。

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

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

  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

 


 



以上是关于栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

栈和队列基本操作

栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

栈和队列知识点总结

栈和队列的面试题Java实现