递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果

Recursive Push Pop Postfix Calculator not properly doing operations, simply takes the last number as the result

本文关键字:最后一个 数字 结果 操作 执行 POSTFIX POP 计算器 递归      更新时间:2023-10-16

我有一个我应该做的递归推动POP POSTFIX计算器,而我对此感到困惑的地方是我出了什么问题。我为我的作业所做的唯一有趣的事情是, pop((不返回值,而只是关于它是否能够完成的true/false手术。PEEK用于检索最高号码。我正在使用的数组是存储char的,程序首先说明"请输入表达式:",它应该拿一个字符串。我设置了它,以忽略它的空间,仅接受数字和 - */符号。

int num = 0
int operate(int num)
{
    while(!stack.isEmpty()){
        if(isdigit(stack.peek()))
        {
            num = (int) stack.peek() - '0';
            stack.pop();
            return num;
        }
        else if(stack.peek() == '+')
        {
            stack.pop();
            return num + operate(num);
        }
        else if(stack.peek() == '-')
        {
            stack.pop();
            return num - operate(num);
        }
        else if(stack.peek() == '/')
        {
            stack.pop();
            return num / operate(num);
        }
        else if(stack.peek() == '*')
        {
            stack.pop();
            return num * operate(num);
        }
    }
    return num;
}

似乎问题是它没有添加任何东西,而只是返回第一个数字。使用标志可以调用正确的次数,但根本不添加,减去,分裂或正确乘以。

输出看起来像

Enter postfix expression: 1 2 +
Pushing 1
Pushing 2
Pushing +
Result: 2
Done? Yes/No: No
Enter postfix expression: 2 2 +
Pushing 2
Pushing 2
Pushing +
Result: 2
Done? Yes/No: No
Enter postfix expression: 1 1 -
Pushing 1
Pushing 1
Pushing -
Result: -1
Done? Yes/No: No
Enter postfix expression: 2 2 *
Pushing 2
Pushing 2
Pushing *
Result: 2

我知道我的问题是我的思维方式,但是根据我的教科书,这应该是正确的。

二进制运算符具有两个操作数。例如,在+上,您需要弹出两个值,添加它们,然后按结果。请注意,对于扣除和分割,操作数不会按正确的顺序推动:您必须交换它们。

'推 '是毫无意义的。

您不需要递归。您已经有一个堆栈,甚至通过将所有输入推入其中来滥用它。该堆栈用于中间和最终结果。后缀是一种线性符号,可以用比中间结果的堆栈更复杂地执行的线性符号,但是 start 没有堆栈中没有任何意义。输入只是操作数和操作员的线性列表。

说您正在用

来称呼它
return operate(num);

您有一个堆栈:22

第一次会弹出 堆栈。

else if(stack.peek() == '+')
{
    stack.pop();
    return 0 + operate(0); // and do this
}

第二次会从堆栈中弹出2个,然后做到这一点,

if(isdigit(stack.peek()))
{
    num = (int) stack.peek() - '0'; // num = 2
    stack.pop();  // 2 is popped
    return num;  // return 2
}

和walla,您有2个结果。

我能够找出答案,我在操作语句中找到了第一个数字,但没有任何其他数字。

正确的代码略有不同

int operate(int num)
{
    while(!stack.isEmpty()){
        if(isdigit(stack.peek()))
        {
            num = (int) stack.peek() - '0';
            stack.pop();
            return num;
        }
        else if(stack.peek() == '+')
        {
            stack.pop();
            return operate(num) + operate(num);
        }
        else if(stack.peek()== '-')
        {
            stack.pop();
            return operate(num) - operate(num);
        }
        else if(stack.peek() == '/')
        {
            stack.pop();
            return operate(num) / operate(num);
        }
        else if(stack.peek() == '*')
        {
            stack.pop();
            return operate(num) * operate(num);
        }
    }
    return num;
}
相关文章: