我是靠谱客的博主 朴实蜻蜓,最近开发中收集的这篇文章主要介绍Python程序员面试算法宝典---解题总结: 第2章 栈、队列与哈希 2.3-2 如何对栈中元素排序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

# -*- encoding: utf-8 -*-

import os

'''

Python程序员面试算法宝典---解题总结: 第2章 栈、队列与哈希 2.3-2对栈中所有元素排序

题目: 对栈进行排序,使得栈顶到栈底的元素按照从小到大的顺序。
例如输入栈是{1,3,2}其中2在栈顶,排序后的栈
为{3,2,1},其中1在栈顶.

分析:
主要思想就是首先将栈底元素移动到栈顶;
这就需要先对除了栈顶的子栈的栈底元素移动子栈顶
2 -> 1
3    2
1    3
其中将栈底元素移动到栈顶也是递归

关键:
1 整体思路
步骤1: 
将栈底元素移动到栈顶,然后获取栈顶元素,弹出栈顶,然后对子栈进行处理,把栈顶元素插入到栈中
步骤2:
将栈底元素移动到栈顶的处理过程如下:
获取当前栈顶元素,弹出当前栈顶元素,然后递归调用当前方法处理子栈,获取处理后子栈的栈顶元素,
并弹出子栈的栈顶,按照大小先插入栈顶和次栈顶元素中的较大值,然后插入较小值

2
def sortStack(s):
    if s.empty():
        return
    # 将栈底元素移动到栈顶,然后获取栈顶元素,弹出栈顶,然后对子栈进行处理,把栈顶元素插入到栈中
    moveBottomToTop(s)
    top = s.getTop()
    s.pop()
    sortStack(s)
    s.push(top)
    
3
def moveBottomToTop(s):
    if s.empty():
        return
    top1 = s.getTop()
    s.pop()
    if not s.empty():
        # 获取递归处理子栈的结果
        moveBottomToTop(s)
        top2 = s.getTop()
        # 必须弹出次栈顶元素
        s.pop()
        if top1 < top2:
            s.push(top2)
            s.push(top1)
        else:
            s.push(top1)
            s.push(top2)
    else:
        s.push(top1)

参考:
Python程序员面试算法宝典

'''

class Stack(object):
    def __init__(self):
        self.list = list()

    # 栈顶元素放在列表的尾部
    def push(self, data):
        self.list.append(data)

    def empty(self):
        result = False if self.list else True
        return result

    def pop(self):
        if self.empty():
            print "stack is empty, it can not pop"
        else:
            self.list.pop()

    def getTop(self):
        if self.empty():
            print "stack is empty, it can not pop"
        else:
            return self.list[-1]

def moveBottomToTop(s):
    if s.empty():
        return
    top1 = s.getTop()
    s.pop()
    if not s.empty():
        # 获取递归处理子栈的结果
        moveBottomToTop(s)
        top2 = s.getTop()
        # 必须弹出次栈顶元素
        s.pop()
        if top1 < top2:
            s.push(top2)
            s.push(top1)
        else:
            s.push(top1)
            s.push(top2)
    else:
        s.push(top1)


def sortStack(s):
    if s.empty():
        return
    # 将栈底元素移动到栈顶,然后获取栈顶元素,弹出栈顶,然后对子栈进行处理,把栈顶元素插入到栈中
    moveBottomToTop(s)
    top = s.getTop()
    s.pop()
    sortStack(s)
    s.push(top)



# def sortStack(s):
#     if s.empty():
#         return
#     top = s.getTop()
#     s.pop()
#     # 递归处理子栈
#     sortStack(s)
#     # 处理完子栈,将栈顶元素插入进去
#     _sortStack(s)
#     s.push(top)


def process():
    stack = Stack()
    stack.push(1)
    stack.push(3)
    stack.push(2)
    sortStack(stack)
    while not stack.empty():
        top = stack.getTop()
        print top
        stack.pop()


if __name__ == "__main__":
    process() 

 

最后

以上就是朴实蜻蜓为你收集整理的Python程序员面试算法宝典---解题总结: 第2章 栈、队列与哈希 2.3-2 如何对栈中元素排序的全部内容,希望文章能够帮你解决Python程序员面试算法宝典---解题总结: 第2章 栈、队列与哈希 2.3-2 如何对栈中元素排序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部