欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法实践:波兰表达式

程序员文章站 2022-03-24 15:17:29
...

波兰表达式

描述

逆波兰表达式,英文为 Reverse Polish notation,跟波兰表达式(Polish notation)相对应。之所以叫波兰表达式和逆波兰表达式,是为了纪念波兰的数理科学家 Jan Łukasiewicz。其在著作中提到:

我在1924年突然有了一个无需括号的表达方法,我在文章第一次使用了这种表示法。

  • 平时我们习惯将表达式写成 (1 + 2) * (3 + 4),加减乘除等运算符写在中间,因此称呼为中缀表达式。
  • 而波兰表达式的写法为 (* (+ 1 2) (+ 3 4)),将运算符写在前面,因而也称为前缀表达式。
  • 逆波兰表达式的写法为 ((1 2 +) (3 4 +) *),将运算符写在后面,因而也称为后缀表达式。

波兰表达式和逆波兰表达式有个好处,就算将圆括号去掉也没有歧义。上述的波兰表达式去掉圆括号,变为* + 1 2 + 3 4。逆波兰表达式去掉圆括号,变成1 2 + 3 4 + *也是无歧义并可以计算的。事实上我们通常说的波兰表达式和逆波兰表达式就是去掉圆括号的。而中缀表达式,假如去掉圆括号,将 (1 + 2)(3 + 4) 写成 1 + 23 + 4,就改变原来意思了。

(作者:黄兢成链接:https://www.zhihu.com/question/41103160/answer/452481026来源:知乎)

(2 + 3) * 4`的波兰表示法为`* + 2 3 4

请写程序求解波兰表达式的值。

本题输入的运算符只包括如下4个运算符:+ - * /

输入

输入为一行波兰表达式,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出

输出为一行,表达式的值。

可直接用printf("%f\n", v)输出表达式的值v。

样例

* + 11.0 12.0 + 24.0 35.0
1357.000000

难度

中,栈 and 递归

代码

code by guowei
算法实践:波兰表达式算法实践:波兰表达式
code by me

#include <bits/stdc++.h>  //万能头文件
using namespace std;
stack<double>st;
double compute(double a,double b,string  c){
    if(c=="+"){
        return a+b;
    }
    else if(c=="-"){
        return a-b;
    }
    else if(c=="*"){
        return a*b;
    }
    else{
        return a*1.0/b;
    }
}
int main()
{
    string s[31];
    int i=0;
    double a,b;
    int flag=0;
    while(cin>>s[i]){
        i++;
    }
    for(int j=i-1; j>=0; --j){
        if(s[j]=="+"||s[j]=="-"||s[j]=="*"||s[j]=="/")//遇到符号从栈中弹出两个个值
        {
            a = st.top();
            st.pop();
            b = st.top();
            st.pop();
            st.push(compute(a,b,s[j]));
        }
        else  //如果是操作数就转换成数压栈
        {
            st.push(atof(s[j].c_str()));
        }
    }
    printf("%.6f",st.top());
    return 0;
}
相关标签: 算法设计