【问题标题】:Calculation of Polish Expression波兰语表达的计算
【发布时间】:2015-04-08 13:19:43
【问题描述】:

我正在寻找可以解释如何计算 Polish Expression 的内容,例如:

如果我有这个((1+2)*4)+3,通常是1+2*4+3 = 15,但我需要 这样写:12+4*3+ 使用 stack 获取顶部的值并再次放入堆栈,请参阅我的代码:https://ideone.com/0bdkkM

我已经看到一篇帖子,但我不明白如何进行所需的操作:StackOverflow

【问题讨论】:

标签: c++ polish-notation


【解决方案1】:

这是一个简单的 RPN 评估器,没有任何错误处理。您只需要一个堆栈来存储操作数,而不是运算符,这使得它很容易实现。

请注意,此版本假定操作数是输入表达式中的单个数字。我这样做是为了简化对 RPN 表达式的解析。在现实生活中,您需要处理多位操作数。

std::stack<int> stack;

const char *expression="12+4*3+";

for(char c=*expression; c!=0; c=*expression++)
{
    switch(c)
    {
        case '+':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs+rhs;
            stack.push(result);
            break;
        }

        case '-':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs-rhs;
            stack.push(result);
            break;
        }

        case '*':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs*rhs;
            stack.push(result);
            break;
        }

        case '/':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs/rhs;
            stack.push(result);
            break;
        }

        default:
            int number=(c-'0');
            stack.push(number);
            break;
    }
}

int final_result=stack.top();
std::cout << "result is " << final_result << std::endl;

【讨论】:

    【解决方案2】:

    Reverse Polish 之所以流行,是因为它很好地映射到计算机的堆栈概念。

    当用户输入一个数字时,将其压入堆栈。

    当用户输入一个运算符时,从栈中弹出2个数字,计算结果,并将结果压回栈中。

    【讨论】:

    • 还需要考虑运算符优先级
    • @Sean 不,你不知道,这就是逆波兰如此简单的原因。用户负责重新排列优先级表达式。
    • 如果您将表达式转换为 RPN,它会这样做。
    • @Sean 问题是关于计算一个逆波兰表达式,而不是转换一个。
    • @GabrielRodrigues 在您接受运算符时进行计算,无需存储它们。
    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多