输入数据中含有一些表达式(数量≤1000,长度按含有的运算计,运算符≤30),表达式的运算符只含有加、减、乘、除。表达式中每个数的精度范围在double型内,表达式中没有任何其他运算符,没有括号。
输入数据中含有一些表达式(数量≤1000,长度按含有的运算计,运算符≤30),表达式的运算符只含有加、减、乘、除。表达式中每个数的精度范围在double型内,表达式中没有任何其他运算符,没有括号。
对每个表达式,计算其结果。按科学计数法输出,精度按6位小数,每个结果应占独立一行。如果表达式发生除0的情况,则对该表达式直接输出“DivByZero”。
输出结果请使用printf("%e\n",ans);或者cout<<scientific<<ans<<endl;
数据结构果然厉害 今天学完栈 就写了 这个 调用了 系统的栈
下面是自己定义的栈 比调用系统的快4ms 这个用时8ms
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
#define lson ((root<<1)+1)
#define rson ((root<<1)+2)
#define MID ((l+r)>>1)
typedef long long ll;
typedef pair<int,int> P;
#define For(i,t,n) for(int i=(t);i<(n);i++)
const int maxn=800001;
const int base=1000;
const int inf=999999;
//栈的定义和需要用到的函数的定义
#define error 0
#define ok 1
#define init_stack_size 500
#define add_size 100
typedef struct
{
char *base;
char *top;
int size;
}cstack;
int init_c(cstack &s)
{
s.base=(char*) malloc(init_stack_size*sizeof(char));
if(!s.base)return error;
s.top=s.base;
s.size=init_stack_size;
return ok;
}
int GetTop_c(cstack s,char &e)
{
if(s.top==s.base)return error;
e=*(s.top-1);
return ok;
}
int push_c(cstack &s,char e)
{
if(s.top-s.base>=s.size)
{
s.base=(char *)realloc(s.base,(s.size+add_size)*sizeof(char));
if(!s.base)return error;
s.top=s.base+add_size;
s.size+=add_size;
}
*s.top=e;
s.top++;
return ok;
}
int pop_c(cstack &s,char &e)
{
if(s.top==s.base)return error;
e=*(s.top-1);
s.top--;
return ok;
}
typedef struct
{
double *base;
double *top;
int size;
}dstack;
int init_d(dstack &s)
{
s.base=(double*) malloc(init_stack_size*sizeof(double));
if(!s.base)return error;
s.top=s.base;
s.size=init_stack_size;
return ok;
}
int GetTop_d(dstack s,double &e)
{
if(s.top==s.base)return error;
e=*(s.top-1);
return ok;
}
int push_d(dstack &s,double e)
{
if(s.top-s.base>=s.size)
{
s.base=(double *)realloc(s.base,(s.size+add_size)*sizeof(double));
if(!s.base)return error;
s.top=s.base+add_size;
s.size+=add_size;
}
*s.top=e;
s.top++;
return ok;
}
int pop_d(dstack &s,double &e)
{
if(s.top==s.base)return error;
e=*(s.top-1);
s.top--;
return ok;
}
//------栈的相关内容结束啦------
//定义操作数优先级
//把+,-,*,/,(,),#依次编码为0,1,2,3,4,5,6
char op[7][7]=
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
int char_to_int(char op)
{
if(op=='+')return 0;
else if(op=='-')return 1;
else if(op=='*')return 2;
else if(op=='/')return 3;
else if(op=='(')return 4;
else if(op==')')return 5;
else return 6;
}
char precede(char a,char b)
{
//函数返回'>','<','=',' '四个字符表示a与b的优先关系
int i=char_to_int(a);
int j=char_to_int(b);
//cout<<i<<','<<j<<endl;
//cout<<op[i][j]<<endl;
return op[i][j];
}
//------以上是运算符优先级 的定义 到此结束
//判断字符是否为数字
bool isnumber(char c)
{
if(c>='0'&&c<='9'||c=='.')
return true;
return false;
}
///计算器
string str;
void solve()
{
cstack optr;init_c(optr);
dstack opnd;init_d(opnd);
push_c(optr,'#');
char oper;
str+='#';
string num1;
int i,j;
for(i=0; i<str.size(); )
{
char e;
GetTop_c(optr,e);
if(str[i]=='#'&&e=='#')
break;
if(isnumber(str[i]))
{
for(j=i; j<str.size(); j++)
{
if(isnumber(str[j]))
num1+=str[j];
else break;
}
push_d(opnd,atof(num1.c_str()));
num1="";
i=j;
}
else
{
char c,x;
GetTop_c(optr,c);
switch(precede(c,str[i]))
{
case'<':
push_c(optr,str[i]);i++;
break;
case'=':
pop_c(optr,x);i++;
break;
case'>':
char oper;
GetTop_c(optr,oper);
pop_c(optr,x);
double a,b,xx;
GetTop_d(opnd,a);
pop_d(opnd,xx);
GetTop_d(opnd,b);
pop_d(opnd,xx);
if(oper=='+')
push_d(opnd,a+b);
else if(oper=='-')
push_d(opnd,b-a);
else if(oper=='*')
push_d(opnd,a*b);
else if(oper=='/')
{
if(a==0)
{
printf("DivByZero\n");
return;
}
push_d(opnd,b/a);
}
break;
}
}
}
double k;
GetTop_d(opnd,k);
printf("%e\n",k);
}
int main()
{
while(cin>>str)
solve();
return 0;
}