编写程序模拟有n(n=9)节车厢的“入轨”和“出轨”过程,(入轨车厢次序满足缓冲轨为3的情况)。车厢可以从入轨的前部移动到一个缓冲轨的顶部或者是出轨处的后部。进入缓冲轨的车厢编号要满足:
①小于要进入的缓冲轨的栈顶元素编号。
②满足条件①里面栈顶元素编号最小的缓冲轨。
③若没有满足条件①的缓冲轨,则进入空的缓冲轨。
def inputStack(bh,stacks,n): # 将车厢移到缓冲轨处
global minNum, minStack,k
bestStack = -1 # bestStack 记录最小车厢编号所在的缓冲轨编号
bestTop = n + 1 # bestTop 记录缓冲轨中的最小车厢编号
for i in range(k):
if len(stacks[i])>0:
top = stacks[i][-1]
if :
bestTop = top
bestStack = i
else:
if bestStack == -1:
bestStack = i
if bestStack == -1:
return False
stacks[bestStack].append(bh)
print('将 %d 号车厢从入轨处移到缓冲轨道 H%d 处。' % (bh, bestStack+1))
if bh < minNum:
minNum = bh
minStack = bestStack
return True
def output(stacks,n):
# 将缓冲轨中的剩余车厢按顺序依次移到出轨处,代码略
# 主程序开始
list = [3,6,9,2,4,7,1,8,5] #车厢的原始编号存放在列表 list 中
n = len(list)
k = 3
hStacks=[ for i in range(k)]
curBH=1
minStack = -1
print("车厢重排过程如下:")
i=0
while i < n:
if list[i] == curBH:
print("将 %d 号车厢从入轨处直接移到出轨处。" % list[i])
i += 1
continue
while True:
minNum = n + 1
for j in range(k):
if len(hStacks[j]) > 0:
if hStacks[j][-1] < minNum:
minNum = hStacks[j][-1]
minStack=j
if minNum == curBH:
print("将%d号车厢从缓冲轨道H%d移到出轨处。" %(minNum,minStack+1))
hStacks[minStack].pop()
curBH += 1
else:
i += 1; break
while curBH<n+1:
output(hStacks,n); curBH += 1
print("完成车厢重排!")