这个Python程序有什么问题?

时间:2013-09-29 12:20:43

标签: python

string = ''
l3 = []
l4 = []
l = []
obj = open('input.txt', 'r')
l1 = obj.readlines()

for i in l1:
    l2 = i.split()
    for j in l2:
        if j != '+' or j != '-' or j != '*' or j != '/':
            l3.append(j)
        else:
            l4.append(j)

    l3.reverse()
    l4.reverse()
    while len(l3) != 0 and len(l4) != 0:
        d = l3[len(l3) - 1]
        del l3[len(l3) - 1]
        e = l4[len(l4) - 1]
        del l4[len(l4) - 1]
        f = l3[len(l3) - 1]
        del l3[len(l3) - 1]
        string = string + '(' + d + e + f + ')'
    string += '\n'
    l.append(string)
j = open('output.txt', 'w')
j.writelines(l)

当我执行程序并打开output.txt时,我得到一个空白文件! 请注意我是初学者,我对python的了解比我使用的更多! 栈: 对不起,这是问题: 堆栈: Stack是一种数据结构(就像列表一样),其中只在一端添加和删除数据,称为顶层

●要将项目添加(推送)到堆栈,它必须放在堆栈的顶部。

●要从堆栈中删除(弹出)一个项目,只有当它位于堆栈的顶部时才必须将其删除 堆栈也是。

●因此,推入堆栈的最后一个元素是要弹出的第一个元素 不在堆栈中 堆栈的许多示例发生在日常情况中。几乎任何自助餐厅都有一堆 托盘或盘子。您只能在顶部移除并添加一个盘子。

中缀表达式:

运算符写在它们的操作数之间。这是我们写的通常方式 表达式。表达式如A *(B + C)/ D.                  通常被视为

后缀表达式:

这里,运算符是在它们的操作数之后写的。上面给出的中缀表达式是 相当于A B C + * D / 操作员的评估顺序始终是从左到右,括号不能用于更改此顺序。因为“+”在上面的例子中是“*”的左边,所以必须在乘法之前执行加法。

在这些表示法之间转换:

只需移动操作符即可直接在这些括号中转换 在括号内,例如(X + Y)至(X Y +)。对一个中的所有操作符重复此操作 表达式,最后删除任何多余的括号。

问题陈述: 编写程序以从输入文件中读取后缀表达式,计算表达式 并将结果打印到输出文件。您可以假设表达式仅涉及 数字和关节运算符,而不是给定例子中的变量。

提示:使用堆栈(可以使用Python列表实现堆栈)

2 个答案:

答案 0 :(得分:4)

我不知道这个程序试图做什么,但有一点想到的是你忘了关闭文件:

j.close()
最后应该调用

更好的是,使用with块让Python自动关闭它:

with open('output.txt','w') as j:
    j.writelines(l)

其他一些提示:

使用更好的变量名称。 jl3等对于阅读您的计划(包括您)的人无益。 l3特别糟糕,因为它几乎看起来像13

而不是if j!='+' or j!='-' or j!='*' or j!='/':(始终为True,无论j的值如何),您可能意味着

if not j in ('+', '-', '*', '/'):

答案 1 :(得分:4)

您可以直接指定最后一个元素,而不是使用'del',同时通过以下方式将其从列表中删除:

d = l3.pop()
e = l4.pop()
f = l3.pop()