注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一路

To find the final symmetry & beauty

 
 
 

日志

 
 
 
 

表达式计算  

2010-09-27 15:36:36|  分类: algorithms |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

复习考研的生活是苦闷的,刚好复习到数据结构,写个表达式计算器,回想一下已经忘掉了的知识。表达式计算 - saturnman - 一路

#include<iostream>

#include<sstream>

#include<cstdlib>

using namespace std;

double parseLine(const string&);

double toDouble(const string&,int&);

void parseError(const string&);

double parseExpression(const string&,int&);

double parseFactor(const string&,int&);

double parseTerm(const string&,int&);

int main()

{

    string input;

    getline(cin,input);

    cout<<parseLine(input)<<endl;

    return 0;

}

double parseLine(const string& input)

{

    int pos = 0;

    return parseExpression(input,pos);

}

double toDouble(const string& input,int& consume_size)

{

    stringstream sstr(input);

    double result;

    sstr>>result;

    if((sstr.rdstate() & stringstream::failbit)!=0)

    {

        parseError("Convert to Double Error.");

    }

    string str_left;

    sstr>>str_left;

    consume_size = input.size()-str_left.size();

    return result;

}

double parseExpression(const string& input,int& pos)

{

    double result = parseTerm(input,pos);

    while(pos!=input.size())

    {

        char op = input.at(pos);

        if(op!='+' && op!='-')

        {

            return result;

        }

        ++pos;

        if(op=='+')

        {

            result += parseTerm(input,pos);

        }

        else if(op=='-')

        {

            result -= parseTerm(input,pos);

        }

        else

        {

            parseError("Invalid Expression");

        }

    }

    return result;

}

double parseTerm(const string& input,int& pos)

{

    double result = parseFactor(input,pos);

    while(pos!=input.size())

    {

        char op = input.at(pos);

        if(op!='*' && op!='/')

        {

            return result;

        }

        ++pos;

        if(op=='*')

        {

            result *= (parseFactor(input,pos));

        }

        else if(op=='/')

        {

            result /= (parseFactor(input,pos));

        }

        else

        {

            parseError("Invalid Expression");

        }

    }

    return result;

}

double parseFactor(const string& input,int& pos)

{

    double result;

    bool negative = false;

    if(input.at(pos)=='-')

    {

        negative = true;

        ++pos;

    }

    if(input.at(pos)=='(')

    {

        ++pos;

        result = parseExpression(input,pos);

        if(input.at(pos)!=')')

        {

            parseError("Invalid Expression.");

        }

        ++pos;

    }

    else

    {

        string substr = input.substr(pos);

        int consume_length;

        result = toDouble(substr,consume_length);

        pos += consume_length;

    }

    return result;

}

void parseError(const string& str)

{

    cout<<str<<endl;

    exit(1);

}

 

试了一下,居然还能用。

C:\Users\saturnman\cpp>parse
(32*32)-3*32-32*2.232-1e-3*(3e-2*5e8)
-14143.4
表达式计算 - saturnman - 一路

  评论这张
 
阅读(545)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018