Aug
16
C++表达式求值类(class expression)
不长不短,150左右的一个类。。
下面是源码:
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。
下面是源码:
#include<iostream>
#include<stack>
using namespace std;
class expression{
/*
class expression by Felix021
usage:
1.
expression exp1 = new expression;
printf("%lf\n", exp1.eval("1+2+3")); //output 6
2.
expression exp1 = new expression("1+2+3");
printf("%lf\n", exp1.eval()); //output 6
3.
expression exp1 = new expression("1+2+3");
printf("%lf\n", exp1.eval()); //output 6
printf("%lf\n", exp1.eval("2*4")); //output 8
printf("%lf\n", exp1.eval()); //output 8
4.
expression exp1 = new expression;
if(exp1.getexp()){
cout << exp1;
}else{
cout << "NULL expression" << endl;
}
*/
private:
static const int maxlen = 1024;
char expr[maxlen], back[maxlen];
void mid2back(){
stack<char>op;
int i, j = 0;
char t;
for(i = 0; expr[i]; i++){
//cout << "Processing " << expr[i] << " @ " << i << endl;
switch(expr[i]){
case '+':
case '-':
while(!op.empty()){
t = op.top();
if(t != '('){
back[j++] = t;
op.pop();
}else{
break;
}
}
op.push(expr[i]);
break;
case '*':
case '/':
while(!op.empty()){
t = op.top();
if(t == '*' || t == '/'){
back[j++] = t;
op.pop();
}else{
break;
}
}
op.push(expr[i]);
break;
case '(':
op.push(expr[i]);
break;
case ')':
while(!op.empty()){
t = op.top();
if(t != '('){
back[j++] = t;
op.pop();
}else{
op.pop();
break;
}
}
break;
case ' ':
break;
default:
if(expr[i] != '.' && !(expr[i] <= '9' && expr[i] >= '0')){
cout << "非法字符!" << endl;
return;
}
while(expr[i] == '.' || (expr[i] <= '9' && expr[i] >= '0')){
back[j++] = expr[i++];
}
back[j++] = '#';
i--;
break;
}
}
while(!op.empty()){
t = op.top();
back[j++] = t;
op.pop();
}
back[j] = 0;
//cout << back << endl;
}
double getans(){
int i;
stack<double>num;
double a, b;
for(i = 0; back[i]; i++){
//cout << "Processing " << back[i] << " @ " << i << endl;
if(back[i] == '.' || (back[i] >= '0' && back[i] <= '9')){
ans = atof(back+i);
num.push(ans);
while(back[i+1] != 0 && back[i+1] != '#') i++;
continue;
}
if(back[i] == '#')continue;
b = num.top();
num.pop();
a = num.top();
num.pop();
switch(back[i]){
case '+':
ans = a + b;
break;
case '-':
ans = a - b;
break;
case '*':
ans = a * b;
break;
case '/':
if((b >= 0 && b < 1e-12) || (b <= 0 && b > -1e-12)){
cout << "除零错误!" << endl;
ans = 1e1000;
return ans;
}
ans = a / b;
break;
default:
cout << "非法字符!" << endl;
ans = 1e1000;
return ans;
}
num.push(ans);
}
ans = num.top();
num.pop();
return ans;
}
double ans;
public:
expression(){
}
expression(char *str){
int i;
for(i = 0; str[i]; i++) expr[i] = str[i];
expr[i] = 0;
}
bool getexpr(){
if(fgets(expr, maxlen, stdin) != NULL){
int i;
for(i = 0; expr[i] != '\n'; i++);
expr[i] = 0;
if(i == 0) return false;
else return true;
}
return false;
}
friend inline ostream & operator<<(ostream &os, expression &a){
a.eval();
os << a.ans;
return os;
}
double eval(char *str){
int i;
for(i = 0; str[i]; i++) expr[i] = str[i];
expr[i] = 0;
mid2back();
return getans();
}
double eval(){
mid2back();
return getans();
}
};
int main(){
expression expr1;
while(expr1.getexpr()){
cout<< expr1 << endl;
}
return 0;
}
#include<stack>
using namespace std;
class expression{
/*
class expression by Felix021
usage:
1.
expression exp1 = new expression;
printf("%lf\n", exp1.eval("1+2+3")); //output 6
2.
expression exp1 = new expression("1+2+3");
printf("%lf\n", exp1.eval()); //output 6
3.
expression exp1 = new expression("1+2+3");
printf("%lf\n", exp1.eval()); //output 6
printf("%lf\n", exp1.eval("2*4")); //output 8
printf("%lf\n", exp1.eval()); //output 8
4.
expression exp1 = new expression;
if(exp1.getexp()){
cout << exp1;
}else{
cout << "NULL expression" << endl;
}
*/
private:
static const int maxlen = 1024;
char expr[maxlen], back[maxlen];
void mid2back(){
stack<char>op;
int i, j = 0;
char t;
for(i = 0; expr[i]; i++){
//cout << "Processing " << expr[i] << " @ " << i << endl;
switch(expr[i]){
case '+':
case '-':
while(!op.empty()){
t = op.top();
if(t != '('){
back[j++] = t;
op.pop();
}else{
break;
}
}
op.push(expr[i]);
break;
case '*':
case '/':
while(!op.empty()){
t = op.top();
if(t == '*' || t == '/'){
back[j++] = t;
op.pop();
}else{
break;
}
}
op.push(expr[i]);
break;
case '(':
op.push(expr[i]);
break;
case ')':
while(!op.empty()){
t = op.top();
if(t != '('){
back[j++] = t;
op.pop();
}else{
op.pop();
break;
}
}
break;
case ' ':
break;
default:
if(expr[i] != '.' && !(expr[i] <= '9' && expr[i] >= '0')){
cout << "非法字符!" << endl;
return;
}
while(expr[i] == '.' || (expr[i] <= '9' && expr[i] >= '0')){
back[j++] = expr[i++];
}
back[j++] = '#';
i--;
break;
}
}
while(!op.empty()){
t = op.top();
back[j++] = t;
op.pop();
}
back[j] = 0;
//cout << back << endl;
}
double getans(){
int i;
stack<double>num;
double a, b;
for(i = 0; back[i]; i++){
//cout << "Processing " << back[i] << " @ " << i << endl;
if(back[i] == '.' || (back[i] >= '0' && back[i] <= '9')){
ans = atof(back+i);
num.push(ans);
while(back[i+1] != 0 && back[i+1] != '#') i++;
continue;
}
if(back[i] == '#')continue;
b = num.top();
num.pop();
a = num.top();
num.pop();
switch(back[i]){
case '+':
ans = a + b;
break;
case '-':
ans = a - b;
break;
case '*':
ans = a * b;
break;
case '/':
if((b >= 0 && b < 1e-12) || (b <= 0 && b > -1e-12)){
cout << "除零错误!" << endl;
ans = 1e1000;
return ans;
}
ans = a / b;
break;
default:
cout << "非法字符!" << endl;
ans = 1e1000;
return ans;
}
num.push(ans);
}
ans = num.top();
num.pop();
return ans;
}
double ans;
public:
expression(){
}
expression(char *str){
int i;
for(i = 0; str[i]; i++) expr[i] = str[i];
expr[i] = 0;
}
bool getexpr(){
if(fgets(expr, maxlen, stdin) != NULL){
int i;
for(i = 0; expr[i] != '\n'; i++);
expr[i] = 0;
if(i == 0) return false;
else return true;
}
return false;
}
friend inline ostream & operator<<(ostream &os, expression &a){
a.eval();
os << a.ans;
return os;
}
double eval(char *str){
int i;
for(i = 0; str[i]; i++) expr[i] = str[i];
expr[i] = 0;
mid2back();
return getans();
}
double eval(){
mid2back();
return getans();
}
};
int main(){
expression expr1;
while(expr1.getexpr()){
cout<< expr1 << endl;
}
return 0;
}
欢迎扫码关注:
转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php 。