使用队列进行前缀评估?

时间:2017-03-19 06:25:00

标签: algorithm queue prefix

我需要使用队列(而不是堆栈)来评估前缀。例如:

 +  3 *  2  1
 is equivalent to 3+(2*1) = 5.

我正在考虑使用dequeue和enqueue一遍又一遍地遍历队列。如果找到模式“operator”+“number”+“number”,则出列3次并将结果排队,直到队列中只剩下一个数字。

while size(q)>1
    if elements are in this pattern: an operator is followed by 2 numbers. 
        operator <--dequeue(q);
        number1 <--dequeue(q);
        number2 <--dequeue(q);
        int a = apply(operator, number1, number2 );
        enqueue (q, a);
    else if the element is a number or operator:
        element <-- dequeue(q);
        enqueue (q, element);

return dequeue(q);

我的算法有两个问题:

  1. 运算符和数字是两种不同的类型,需要保存在一个队列中。如何在int队列中保存“+”?
  2. 2 3 +是无效输入,但它最终将返回5. 2和3将排入右侧,它变为+ 2 3.如果输入无效,我该如何阻止它?
  3. 非常感谢

2 个答案:

答案 0 :(得分:0)

<强>答案 -
1-这不是解决前缀输入的最佳算法(Stack方法更好) 2-您可以为每个操作员指定一个特殊编号(对于' - ',请说-999)。

更好的方法(没有堆叠)
 尝试这样的递归方法

简单递归:

 int c=0;
    Evaluate(input,current_position):
       c++;
      Read a token from input at current pos.
      If the token is a value:
        Return the value of the token
      If the token is a binary operator:
        if(current_position+2 exists)
          Let first_argument = Evaluate(input,current_position+1)
          Let second_argument = Evaluate(input,current_position+2)
          Return apply(operator, first_argument, second_argument)
        else
          invalid expression.

if(c==len(expression)
  valid exp
else
  invalid exp

答案 1 :(得分:0)

这是我使用队列结构的递归解决方案(Last in First out)。

方法2: 每个元素都将从旧队列中出列,并排入新列表。如果找到模式,则出列3次并将结果排入新队列。如果队列长度未更改,则报告无效输入。

Define: 

1. Given an input string. 
2. Recursive function: int prefix_eval( q ) 
    Base case: if size(q)==1, return dequeue(q); 
    Create a new queue: new_q; 
    int old_qlen = q->qlen; 

    While(size(q)>0) 
        if q->data[0] is an operator, q->data[1] and q->data[2] are numbers.  
            operator <--dequeue(q); 
            number1 <--dequeue(q);
            number2 <--dequeue(q); 
            element = apply(operator, number1, number2 ); 
            enqueue (new_q, element);  
        Else: 
            element = dequeue(q); 
            enqueue(new_q, element); 
        If (old_qlen > new_q->qlen) 
            Prefix_eval(new_q); 
        Else 
            Report invalid input and return  


Start: 
    Create a queue q; 
    Enqueue q with each token from the input
    Prefix_eval(q);