使用递归评估后缀表达式

时间:2011-11-10 02:45:28

标签: java recursion postfix-notation

我需要一种使用递归来评估后缀表达式的算法。在此后缀表达式中,操作数可以是多个数字。空格用于区分两个操作数。所以表达式'45 68 +'是有效的。

我想过以相反的方向对它进行评估,但我认为这不应该是正确的。

有人可以帮我解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:1)

不会让我感觉像是一个递归友好的问题。但我相信它可以这样做。

我有两种方法:

选项#1:进行函数递归调用并返回匹配Wiki上描述的堆栈推送和弹出操作。

这种方法的缺点是你会很快发现函数返回的数据可能相当复杂。它可能是一个运营商。也许使用可选的操作数(IE:数字)。你将返回可能应该有操作(方法)的结构/对象。

选项#2:每个递归调用都会处理输入流的下一个字符。

我认为这种方法会作为参数传递给堆栈,也可能是当前数字的“累加器” - 在将数字推入堆栈之前将数字累加到数字中。将返回一个巨大的尾递归数值结果。

这种方法实际上只是将循环重写为递归。

无论哪种方式,自己搞清楚应该具有挑战性和教育性!

答案 1 :(得分:1)

以下是一种伪代码,适用于带有+/-的后缀表达式。我想你可以进一步扩展这个想法。如果您仍然遇到困难,请将我邮寄到2shanks.p@gmail.com,因为我不是这个网站的常客。

void recursivePostfix(char* expr)  
{  
if(!expr)   return;  

bool flag=true;
static double result=0;
double v1=result, v2=0, dec=0;
char oper='0';
int i=0, state=1;

do
{
    if('0' != oper)
    {
        switch(oper)
        {
            case '+': result=v1+v2; break;
            case '-': result=v1-v2; break;
            case '*': result=v1*v2; break;
            case '/': result=v1/v2; break;
        }
        oper = '0';
        v1 = result;
        v2 = 0;
        recursivePostfix(expr+i);
    }

    if(SPACE_CHAR == *(expr+i) && state++)
        continue;

    switch(state)
    {
        case 1:
            v1 = v1*10 + (expr[i]-'0'); break;
        case 2:
            v2 = v2*10 + (expr[i]-'0'); break;
        case 3:
            oper = *(expr+i);
    }  
}while(0 != *(expr+i++));
cout << result;

}