Python前缀使用堆栈数据结构的中缀表示法

时间:2018-04-21 14:36:30

标签: python stack

我在使用堆栈数据结构解决问题时遇到了分配问题。我被提示进行以下堆栈功能。

任务:使用您创建的堆栈,编写接受前缀表达式(表示为列表)的函数prefix_infix,并以完全括号中缀表示法返回表达式。考虑仅涉及二元运算符的表达式(+,-,*,/)您可以在此处找到有关前缀的信息: http://en.wikipedia.org/wiki/Polish_notation

def make_stack(): 
    stack=[]
    def helper(*args): 
        if args[0]=='push': 
            stack.append(args[1])
        elif args[0]=='peek': 
            return (stack[-1]) 
        elif args[0]=="pop": 
            return (stack.pop())
        elif args[0]=="size": 
            return (len(stack))
    return helper 



def prefix_infix(lst): 
    stk=make_stack() 
    def helper(lst):
        if type(lst)==int: 
            stk('push',str(lst))
        elif lst in ('+','-','*','/'): 
            left=stk('pop')
            right=stk('pop')
            element="("+left+" "+lst+" "+right+")"
            stk('push',element)
        else:
            return helper(lst[2]),helper(lst[1]),helper(lst[0]) 
    helper(lst)
    return stk('pop')

prefix_infix(['+',['*',5,4],['-',2,1]])
#Output: "((5 * 4) + (2 - 1))"

prefix_infix(['-',['*',5,4],['-',['/',1,45],['+',1,1]]])
#Output:((5 * 4) - ((1 / 45) - (1 + 1)))

我以某种方式得到了我的代码以产生正确的输出,但我对我的方法并不十分自信,因为我用递归做了它但我不知道用递归来做这件事的正确方法是什么(我的递归调用与,似乎是随意的。有人可以建议我可以编写的其他版本的代码,以便更容易理解吗?我无法真正想象堆栈,大多数时候我只是幸运地使用递归函数。

2 个答案:

答案 0 :(得分:1)

如果使用递归,则不必手动管理堆栈(递归管理堆栈)。例如:

def prefix_infix(expression):
    if isinstance(expression, list):
        op, left, right = expression
        return '(' + prefix_infix(left) + op + prefix_infix(right) + ')'
    else:
        return str(expression)

print(prefix_infix(['+',['*',5,4],['-',2,1]]))
print(prefix_infix(['-',['*',5,4],['-',['/',1,45],['+',1,1]]]))

输出:

((5 * 4) + (2 - 1))
((5 * 4) - ((1 / 45) - (1 + 1)))

编辑(评论后):这是添加表达式数值评估的版本:

def eval_prefix(expression):
  return eval(prefix_infix(expression))

输出:

eval_prefix(['+',['*',5,4],['-',2,1]])) # --> 21
eval_prefix(['-',['*',5,4],['-',['//',9,3],['+',1,1]]])) # --> 19

答案 1 :(得分:0)

{% for tr in db_training %}
    <tr>
        <td class="tweet">{{tr.tweets}}</td>
        <td class="type">{{tr.dtype}}</td>
        <td class="manual">
            <select id="dselect_{{ forloop.counter }}" onchange="getValue(this)">
                <option value="$">Pilih</option>
                <option value="negatif">Negatif</option>
                <option value="netral">Netral</option>
                <option value="positif">Positif</option>
            </select>
        </td>
        <td id="dselect_{{ forloop.counter }}-value"></td>
        <td class="auto">{{tr.auto}}</td>
    </tr>
{% endfor %}