我有一个Stack ADT,当调用create(stack.create())时会返回一个形式元组("这个Stack包含",list())。 ADT中的其他内容包括push / pop / size / is_empty
现在我有一个文件,file.txt,就像这样
1 2 3 4
5 6 7 8
我希望它输出像
8 7 6 5
4 3 2 1
到目前为止,我的代码是这样的:
import StackADT as stack
file = open("file.txt", "r")
stack_main = stack.create()
stack_rev = stack.create()
for line in file:
line = line.split()
stack.push(stack_main, line)
print(stack_main)
print(stack_main)
输出
("This Stack Contains", [['1','2','3','4'],['5','6','7','8']])
然后我将['5','6','7','8']
列表推送到我的第二个堆栈,如下所示:
stack.push(stack_rev, stack.pop(stack_main))
print(stack_rev)
给出:
("This Stack Contains", [['5', '6', '7', '8']])
现在我的问题是如何从stack_rev弹出项目5,6,7,8
?
我尝试使用for循环,但它给了我一个错误。我也尝试添加if语句:
for i in stack_rev:
if i == 'This Stack Contains':
pass
else:
for x in i:
print(stack.pop(stack_rev))
但它只返回一个空堆栈,如下所示:(" This Stack Contains",[]) 任何帮助,将不胜感激。谢谢。
答案 0 :(得分:0)
很好的尝试,但您的代码存在一些问题。
您正在使用stack.push
作为第二个参数调用list
,如果我理解正确,您应该推送一个元素。
您只进入stack_rev
一次。您必须使用循环,以便stack_main
中的每个元素都被推送到stack_rev
。
您应该如何构建stack_main
:
for line in file:
for element in line.split():
stack.push(stack_main, element)
这就是你应该如何扭转你的筹码:
for _ in range(len(stack_main[1])): # loop n times; where n = length of stack
stack.push(stack_rev, stack.pop(stack_main))
如果通过弹出元素打印stack_rev
,您将再次反转元素(这将取消第一次反转)。我建议您循环list
中的stack
来打印元素。
像这样:
for elem in stack_rev[1]:
print(elem, end=" ")
你做错了OOP!你在这里展示的StackADT的实现非常类似于C。而不是让模块具有接受目标堆栈的函数,而是创建一个Stack类并实现方法。
如果你是初学者,你可能还没理解我上面所说的,但是对OOP(面向对象编程)做了一些研究。