我需要使用队列(而不是堆栈)来评估前缀。例如:
+ 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);
我的算法有两个问题:
非常感谢
答案 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);