波兰表达的计算

时间:2015-04-08 13:19:43

标签: c++ polish-notation

我正在搜索解释我如何计算Polish Expression的内容,例如:

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

我已经看过一篇文章,但我不明白我如何才能完成所需的操作:StackOverflow

2 个答案:

答案 0 :(得分:1)

反向波兰变得流行的原因是因为它很好地映射到堆栈的计算机概念。

当用户输入数字时,将其推入堆栈。

当用户进入操作员时,从堆栈中弹出2个数字,计算结果,然后将结果推回堆栈。

答案 1 :(得分: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;