2010-09-27 15:36:36| 分类: algorithms | 标签: |举报 |字号大中小 订阅
复习考研的生活是苦闷的,刚好复习到数据结构,写个表达式计算器,回想一下已经忘掉了的知识。
#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
评论