波兰语表达式的计算

Calculation of Polish Expression

本文关键字:计算 表达式 波兰语      更新时间:2023-10-16

我正在寻找解释如何计算Polish Expression的东西,例如:

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

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

这里有一个简单的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个数字,计算结果,然后将结果推回到堆栈上。