使用Stack ADT反转文件

时间:2018-02-07 07:37:07

标签: python data-structures stack

我有一个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",[]) 任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

很好的尝试,但您的代码存在一些问题。

  1. 您正在使用stack.push作为第二个参数调用list,如果我理解正确,您应该推送一个元素。

  2. 您只进入stack_rev一次。您必须使用循环,以便stack_main中的每个元素都被推送到stack_rev

  3. 解决方案

    您应该如何构建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(面向对象编程)做了一些研究。