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即是湖景房对应的高度
与要求相符