前缀式计算 ACM 数据结构

来源:互联网 发布:node.js 微信 编辑:程序博客网 时间:2024/05/18 00:38

原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=128

原题描述:

                先说明一下什么是中缀式:

     如2+(3+4)*5这种我们最常见的式子就是中缀式。

     而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))

     然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )

     把括号去掉就是:+ 2 * + 3 4 5

                最后这个式子就是该表达式的前缀表示。

                给你一个前缀表达式,请你计算出该前缀式的值。

                比如:

                + 2 * + 3 4 5的值就是 37

我的解题思路:

             使用递归的方式进行求解,不同的情况,递归调用函数fun().当是数字的时候,先将数字存储在一个字符串中,然后再用sscnaf'将其转化成double类型的

代码:

#include <iostream>//c_str()将字符串转换成字符数组类型 #include <string.h>//对于字符串类型的数据,在求解其长度的时候,要用函数size() #include <stdio.h>//gets只能用于字符数组,而不能直接用于字符串数组,对于字符串可以直接用cin输入 //while(getline(cin,line))语句注意这里默认回车符停止读入,按Ctrl+Z或键入EOF回车即可退出循环。using namespace std;string str;int pos;double fun(){pos++;if(str[pos] == ' ') pos++;if(str[pos] >= '0' && str[pos] <= '9'){    string s;   while(pos != str.size() && str[pos] != ' ')     s+=str[pos++];     double tp;     sscanf(s.c_str(),"%lf",&tp);     return tp; }if(str[pos] == '+')return fun()+fun();if(str[pos] == '-')    return fun()-fun();    if(str[pos] == '*')    return fun()*fun();if(str[pos] == '/')    return fun()/fun();} int main(){while(getline(cin,str)){pos=-1;printf("%.2lf\n",fun());} } 


原创粉丝点击