【问题标题】:prefix evaluate using a queue?使用队列进行前缀评估?
【发布时间】:2017-03-19 06:25:00
【问题描述】:

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

 +  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。如果输入无效,我该如何防止呢?

非常感谢

【问题讨论】:

    标签: algorithm queue prefix


    【解决方案1】:

    答案-
    1- 不,这不是解决前缀输入的最佳算法(堆栈方法更好)。
    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
    

    【讨论】:

    • 对更好算法的任何提示(无堆栈)?
    • 你理解它有什么困难吗?
    • 我认为递归方法在什么方面更好?如何实现错误检查?像 2 3 +
    • 对于错误检查,你可以计算递归函数被调用了多少次。如果它等于表达式的长度,那么它是一个有效的表达式,否则它是无效的。检查编辑的答案
    【解决方案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); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多