美文网首页Python
python-翻转栈中的元素-递归法

python-翻转栈中的元素-递归法

作者: DKider | 来源:发表于2019-04-14 22:04 被阅读12次

给定一个栈stack,利用较低的空间复杂度将栈中的元素位置翻转。

这里我用了两个递归实现,外层递归:每次调用除栈顶以外的子栈;内层递归:将栈低元素移到栈顶,直到栈中只有一个元素。

这个思想是:每次递归调用当前栈除弹出栈顶元素的子栈,每一次都将这个栈的栈底元素放到栈顶,其他元素不变;然后保存这个栈顶,这个栈顶其实是最初栈的栈底元素;在调用除了这个栈顶元素的子栈,继续把栈底元素拿到栈顶,保存这个栈顶,这个栈顶是倒数第二个栈底元素。然后一直递归下去,直到栈为空。

说它是两个递归是因为在把栈底元素放到栈顶的这个操作也是用递归实现的。

学了一整天,lay了。就这样吧,反正我理解了。这种方法时间复杂度较高,达到了O(n^2),但是空间复杂度是O(n)。时间换空间。

class LNode:
    def __init__(self,arg):
        self.data=arg
        self.next=None
class MyStack:
    #模拟栈
    def __init__(self):
        #phead=LNode(None)
        self.data=None
        self.next=None
    #判断栈是否为空,如果为空返回True,否则返回false
    def isEmpty(self):
        if self.next is None:
            return True
        else:
            return False
    #返回栈的大小
    def size(self):
        size=0
        p=self.next
        while p is not None:
            size+=1
            p=p.next
        return size
    #返回栈顶元素
    def top(self):
        if not self.isEmpty():
            return self.next.data
        else:
            print("栈为空")
            return None

    #返回栈底元素
    def bottom(self):
        if not self.isEmpty():
            p=self.next
            while p.next is not None:
                p=p.next
            return p.data
        else:
            print("栈为空")
            return None
    #弹栈
    def pop(self):
        if not self.isEmpty():
            p=self.next
            self.next=self.next.next
            print("弹栈成功")
            return p.data
        else:
            print("栈已为空")
            return None
    #压栈
    def push(self,item):
        tmp=LNode(item)
        p=self.next
        self.next=tmp
        tmp.next=p
        print("入栈成功")
    #清空栈
    def destroy(self):
        self.next=None
        print("栈已清空")

    # 打印栈
    def showStack(self):
        p = self.next
        while p is not None:
            print(p.data)
            p = p.next

"""
功能:将栈底元素移至栈顶
"""
def MoveBottomToTop(stack):
    #保存栈顶元素
    StackTop=stack.top()
    #弹出栈顶元素
    stack.pop()
    #处理不包含栈顶元素的子栈
    if not stack.isEmpty():
        MoveBottomToTop(stack)
        SonStackTop=stack.top()
        stack.pop()
        #交换栈顶与子栈顶元素
        stack.push(StackTop)
        stack.push(SonStackTop)
    else:
        stack.push(StackTop)
"""
功能:递归调用除栈顶以外的子栈
"""
def RecursionInvokoingSonStark(stack):
    if not stack.isEmpty():
        #保存栈顶元素
        MoveBottomToTop(stack)
        StackTop=stack.top()
        #弹出栈顶元素
        stack.pop()
        print("\n")
        #递归调用除栈顶以外的子栈
        RecursionInvokoingSonStark(stack)
        stack.push(StackTop)
    else:
        return

        
if __name__ == '__main__':
    stack=MyStack()
    a="abcdefg"
    #将“abcdefg"存栈中
    for i in a:
        stack.push(i)
    #打印栈中元素---从后往前
    stack.showStack()
    #递归调用
    RecursionInvokoingSonStark(stack)
    print("\n")
    #打印栈中元素---从后往前
    stack.showStack()

这以前的代码写的是真的丑啊!
lay了,lay了,不写了。睡觉了。@!!!!

相关文章

  • python-翻转栈中的元素-递归法

    给定一个栈stack,利用较低的空间复杂度将栈中的元素位置翻转。 这里我用了两个递归实现,外层递归:每次调用除栈顶...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 用栈翻转

    用栈翻转 「栈翻转」是一个非常重要的性质, 有 字符串的翻转 整数的翻转 把栈转换成队列 0X00 栈翻转 整数的...

  • 每周 ARTS 第 10 期

    1. Algorithm 226. 翻转二叉树(简单) 描述: 翻转一棵二叉树 示例: 思路: 递归法:翻转一个二...

  • 155. 最小栈

    思路:每次往栈中压入两个元素,1个是实际要入栈的元素,1个是当前栈中的最小元素。这样是为了方便迅速查找到当前栈中的...

  • 栈与队列

    栈与队列 栈 栈是一种限定仅在一端进行插入和删除的 线性表 ,无论是往栈中插入元素还是删除栈中的元素,或者读取栈中...

  • 04_栈

    栈的初识 栈是一种特殊的线性表,只能在一端进行操作 往栈中添加元素的操作,一般叫做push,入栈 从栈中移除元素的...

  • 06-栈

    栈 栈也是一种特殊的线性表,只能在一端进行操作 往栈中添加元素的操作,一般叫做push,入栈 从栈中移除元素的操作...

  • day6栈和队列

    栈 栈是一种特殊的线性表,只能在一端进行操作,往栈中添加元素的操作,一般叫做push,入栈,从栈中移除元素的操作,...

  • 栈与队列

    栈 栈是一种特殊的线性表,只能在一端进行操作 往栈中添加元素的操作,一般叫做 push,入栈 从栈中移除元素的操作...

网友评论

    本文标题:python-翻转栈中的元素-递归法

    本文链接:https://www.haomeiwen.com/subject/kuoswqtx.html