一本通1198 逆波兰表达式

您所在的位置:网站首页 1198逆波兰表达式 一本通1198 逆波兰表达式

一本通1198 逆波兰表达式

2023-10-01 23:41| 来源: 网络整理| 查看: 265

【题目描述】

逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。

【输入】

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

【输出】

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

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

【输入样例】 * + 11.0 12.0 + 24.0 35.0 【输出样例】 1357.000000

代码:

#include#include#include#include#include#includeusing namespace std;char a[101];double ni(){ scanf("%s",a); if(a[0]=='+') return ni()+ni(); if(a[0]=='-') return ni()-ni(); if(a[0]=='*') return ni()*ni(); if(a[0]=='/') return ni()/ni(); else return atof(a);}int main(){ printf("%f\n",ni()); return 0;}

代码非常短,我写这个题主要是因为思路非常巧妙。不再细致到每一句注释,直接捋思路。这个代码的思路大致就是,如果你输入的是一个运算符,那么就要再输入两个数来完成一次运算,这个巧妙的递归就是用了这个原理,如果你输入一个运算符,那么就要再输入两次。如果还是运算符,那么继续递归。知道把所有的运算符都“消耗完”,那么就根据各自的运算符进行加减乘除。打个比方,一个运算符是一个根,一个数字就是一片叶子。叶子底下不能结叶子和根,当它成为一片叶子也就是一个数字时,就停止递归。反之,根可以一直生根,除非长出叶子。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3