python算法建模--湖景房

python算法建模–湖景房

在这里插入图片描述

首先这道题是一道排序题,排序的算法十分简单,但问题在于数据的存与取,采用堆栈的数据结构可以让事情变得很简单,但遗憾的是Python语言没有栈和队列数据结构,只能用数组 List 或双端队列 deque 实现。那么我们就利用数组来“创造”队列和栈:

队列和栈的实现

队列实现算法:

class Queue:
    def __init__(self):
        self.arr = []
    def push(self, num):
        self.arr.append(num)
    def peek(self):
        if not self.arr:
            raise Exception("the Queue is empty")
        return self.arr[0]
    def poll(self):
        if not self.arr:
            raise IndexError("the Queue is empty")
        return self.arr.pop(0)
    def isEmpty(self):
        return self.arr == []

栈实现算法

class Stack:
    def __init__(self):
        self.arr = []
    def peek(self):
        if self.arr == []:
            return None
        return self.arr[-1]
    def push(self, num):
        self.arr.append(num)
    def pop(self):
        if not self.arr:
            raise Exception("the arr is empty")
        return self.arr.pop()
if __name__ == '__main__':
    s = Stack()
    s.pop()

算法设计

利用栈后进先出的特性,从左向右分析时将结果存于栈十分方便
在循环比较过程中,如果找到了湖景房,那么其之前的数据必然不是海景房,利用递归思想可以进一步优化代码
首先对队列进行弹出队列压栈作为擂主,采用直接弹出队列的方法是为配合递归,可以在之后的循环找到湖景房之后丢弃其之前的无用数据,进而大大缩减运算步骤。
如果没有找到比擂主高的新擂主则需要重复初始弹出队列压栈的步骤,但如过找到了比擂主高的新擂主,则可以直接将剩下的数据代入递归循环,进而遗弃无用数据减小了循环次数。
将原始数据压入队列并进行初始化操作后,运行递归函数fun,最后留在栈中的数据便是湖景房对应的高度。

实例演绎

已知高度存于a=[4,5,1,3,2,7,6]

import sys
sys.setrecursionlimit(100000) #原始数据
a=[4,5,1,3,2,7,6]
A="".join(list(map(str,a)))
#队列实现算法
class Queue():
    def __init__(self):
        self.arr = []
    #压入
    def push(self, num):
        self.arr.append(num)
    #查看
    def peek(self):
        if not self.arr:
            #raise Exception("the Queue is empty")
            return None
        return self.arr[0]
    #弹出
    def poll(self):
        if not self.arr:
            #raise IndexError("the Queue is empty")
            return None
        return self.arr.pop(0)
    def getSize(self):
        return len(self.arr)
    def isEmpty(self):
        return self.arr == []
#栈实现算法
class Stack():
    def __init__(self):
        self.arr = []
    #查看
   
    def peek(self):
        if self.arr == []:
            return None
        return self.arr[-1]
    #压入
    
    def push(self, num):
        self.arr.append(num)
    #弹出
    
    def pop(self):
        if not self.arr:
            raise Exception("the arr is empty")
        return self.arr.pop()
#创建实例
queue=Queue()
stack=Stack()
#将A压入队列
for i in A:
    queue.push(i)
stack.push(queue.poll())
#取队列的值压入栈
def fun(queue,stack):
    global stackCache
    global queueCache
    global A
    if queue.isEmpty():
        return stack
    stackCache=stack.peek()
    #while (queue.peek()):
    for i in range(queue.getSize()):
        #if i==len(A):
            #return stack
        queueCache=queue.poll()
        
        #stack需要先弹出,再压入下一个
        if queueCache>stackCache:
            stack.pop()
            stack.push(queueCache)
            fun(queue,stack)
            return stack
        #else:
            #queue.push(queueCache)
            #return stack
    #stack不必弹出,只需压入下一个
    #print(stackCache)
    A=A.split(stackCache)[-1]
    for i in A:
        queue.push(i)
    stack.push(queue.poll())
    fun(queue,stack)
    return stack
    return stack
result=fun(queue,stack);
while result.peek():
    print(result.pop())

运行结果:

6
7即是湖景房对应的高度
与要求相符

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值