计算器 表达式求值 数据结构

Input

输入数据中含有一些表达式(数量≤1000,长度按含有的运算计,运算符≤30),表达式的运算符只含有加、减、乘、除。表达式中每个数的精度范围在double型内,表达式中没有任何其他运算符,没有括号。

Output

对每个表达式,计算其结果。按科学计数法输出,精度按6位小数,每个结果应占独立一行。如果表达式发生除0的情况,则对该表达式直接输出“DivByZero”。

Sample Input

3+5.06-2*76-2/03+5*6+13+5+1*71+2-3*4+5/6-4*3*2*1*1+2+3+4+5

Sample Output

8.000000e+00-8.000000e+00DivByZero3.400000e+011.500000e+01-1.816667e+01

HINT

 输出结果请使用printf("%e\n",ans);或者cout<<scientific<<ans<<endl;

Source





#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;




//定义操作数优先级
//把+,-,*,/,(,),#依次编码为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()
{
    stack<char> optr;
    stack<double> opnd;
    optr.push('#');
    char oper;
    double num;
    str+='#';
    string num1;
    int i,j;
    for(i=0; i<str.size(); )
    {
        if(str[i]=='#'&&optr.top()=='#')
            break;
        if(isnumber(str[i]))
        {
            for(j=i; j<str.size(); j++)
            {
                if(isnumber(str[j]))
                    num1+=str[j];
                else break;
            }
            opnd.push(atof(num1.c_str()));
            num1="";
            i=j;
        }
        else
        {
            switch(precede(optr.top(),str[i]))
            {
            case'<':
                optr.push(str[i]);i++;
                break;
            case'=':
                optr.pop();i++;
                break;
            case'>':
                char oper=optr.top();
                optr.pop();
                double a=opnd.top();
                opnd.pop();
                double b=opnd.top();
                opnd.pop();
                if(oper=='+')
                    opnd.push(a+b);
                else if(oper=='-')
                    opnd.push(b-a);
                else if(oper=='*')
                    opnd.push(a*b);
                else if(oper=='/')
                {
                    if(a==0)
                    {
                        printf("DivByZero\n");
                        return;
                    }
                    opnd.push(b/a);
                }
                break;
            }
        }
    }
    printf("%e\n",opnd.top());
}
int main()
{
    while(cin>>str)
          solve();
    return 0;
}

数据结构果然厉害   今天学完栈  就写了  这个 调用了 系统的栈  

下面是自己定义的栈  比调用系统的快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;
}



















你可能感兴趣的:(数据结构)