c++ - 中缀表达式评估

标签 c++ notation infix-notation

<分区>

我想在 C++ 中评估(而不是转换)中缀表达式。如果您拥有算法或什至实现此类算法(可能不是 C++,任何语言......我会尝试将其重写为 C++),请分享。

求值是指给出表达式的值。 (2+2)*3 等于 12

对不起,我忘了我在谈论堆栈解决方案,因为我知道树解决方案并且这次不合适:(.

最佳答案

你是怎么得到这个表达式的?如果你得到它像 (3 + 4) - (1 * 2) + 1 =

                  +  
            /          \
           -            1
     /          \   
    +            *          
 /     \      /    \
3      4    1       2

http://cboard.cprogramming.com/cplusplus-programming/32682-inserting-infix-into-binary-tree.html

Left Root Right 那样做一棵树的横切,所以它会是这样的:3 + 4 结果 - 1 * 2 结果 + 1 的结果。

如果你得到像 34+12*-1+ 这样的表达式,你可以像做一个堆栈一样模拟汇编,如果你得到一个运算符,弹出堆栈中的最后 2 个元素并应用运算符:将3入栈,将4入栈,得到op。 + 所以弹出最后 2 个元素并使用运算符。现在你只有 7 个堆栈。现在阅读直到得到一个运算符,所以在堆栈中你将在运算之后有 7 1 2。 * 在堆栈中,您在操作后得到 7 2。 - 你只得到 5 in stack add 1 in stack: Stack 5 1, 使用最后一个运算符 + 得到最终结果 6.

好的,这是代码:

#include <STACK>

int GetResult( char * rpn ) 
{
    std::stack<int> myStack;

    int nr1, nr2; int length = strlen(rpn);

    for (int i = 0; i < length; i++)
    {
        if (isdigit(rpn[i]))
        {
            myStack.push(rpn[i] - '0');
        }
        else
        {
            switch(rpn[i])
            {
                case '+':
                    nr1 = myStack.top();
                    myStack.pop();
                    nr2 = myStack.top();
                    myStack.pop();
                    myStack.push(nr2 + nr1);
                    break;

                case '-':
                    nr1 = myStack.top();
                    myStack.pop();
                    nr2 = myStack.top();
                    myStack.pop();
                    myStack.push(nr2 - nr1);
                    break;

                case '*':
                    nr1 = myStack.top();
                    myStack.pop();
                    nr2 = myStack.top();
                    myStack.pop();
                    myStack.push(nr2 * nr1);
                    break;

                case '/':
                    nr1 = myStack.top();
                    myStack.pop();
                    nr2 = myStack.top();
                    myStack.pop();
                    myStack.push(nr2 / nr1);
                    break;
                default:
                    break;
            }
        }
    }

    return myStack.top();
}

int main(int argc, char* argv[])
{
    char *rpn = "34+12*-1+";

    int rez = GetResult(rpn);

    printf("%i", rez);

    return 0;
}

关于c++ - 中缀表达式评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12122161/

相关文章:

C:中缀到后缀转换的堆栈转储错误

c++ - 如何释放 glBufferData 内存

C++ 如何替换这个 if...else 语句?

python - 将 python float 写入文件时抑制科学记数法

algorithm - 为什么我们不能使用 O-Notation 来比较算法?

ip - 不常见的 IP 符号

list - 了解Scala中的infix方法调用和cons运算符(::)

data-structures - 将中缀转换为前缀转换

c++ - 如何使用 OpenGL 绘制 OpenMesh

c++ - 超时 fwrite 调用以防止其阻塞