自己写的四则运算,可加括号

来源:互联网 发布:淘宝类似的购物网站 编辑:程序博客网 时间:2024/05/01 01:05

#include<iostream>
#include<vector>

 

using namespace std;
double getnumber(char*&p)
{
 bool falg=true;
double num=0;
double prec=1;//小数点位数
double fnum=0;
if(*p=='-')
{falg=false;//数据为负数
p++;
}
while(*p)
{
if(*p>='0'&&*p<='9')
{num=num*10+*p-'0';p++;}
else
if(*p=='.')
{       p++;
 while(*p)
 {
        if(*p>='0'&&*p<='9')
  {
   prec=prec*0.1;
   fnum+=prec*(*p-'0');
   p++;
          }
  else
   break;
 }
}
else
break;
}
if(!falg)
return -(num+fnum);
return num+fnum;
}
//这个函数让p指向了下一个


bool Issign(char*&p,double&num)
{
 if(*p>='0'&&*p<='9')
 {
  //利用传入参数返回数据
  num=getnumber(p);
  return false;//非运算符号
 }
 else
  return true;//返回的p指向当前的运算符号
}

//利用这个计算
double complicate(double a,double b,char*p)
{
switch(*p)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}


//利用这个判断两个符号的优先级别
bool chose(char la,char rb)
{
 if(la=='*'||la=='/')
  return true;  //当优先级是左边比较高或者左右相等时,统一先算左边
 if(rb=='*'||rb=='/')//右边比较高时先算右边
  return false;
 return true;
}


//利用上面这个计算,当我们计算条件:遇到‘)’或者p为空且符号数组不为空时
//则调用下面这个函数

//作用,只进行一次括号内运算或者空
void complicateEx(vector<char>&sv,vector<double>&nv)
{
 bool falg=true;
 char rb;
 char*c;
 while(sv.size()!=0)
 {
  rb=sv.back();
  sv.pop_back();

  if(rb=='(')
   return ;
  else
  {
   char p;
/////////////////////////////////////在字符vector中选择合适的符号
   if(sv.size()!=0)
   {
    char la=sv.back();
             sv.pop_back();

    if(la=='(')//假如存在前一字符,不过为‘(’
    {
     p=rb;
    double b=nv.back();
    nv.pop_back();
   double a=nv.back();
    nv.pop_back();
    double num=complicate(a,b,&p);
    nv.push_back(num);
    return ;
   
   
    }
    else
    if(chose(la,rb))//返回真,左边为合适的
    {
     //nv.push_back()
     sv.push_back(rb);//所以押回rb
       p=la;
    falg=false;//说明要弹出三个
    }
    else//返回false,右边为合适的,所以押回左边
    { p=rb;   sv.push_back(la);     }
   }
   else
    p=rb;//假如不存在前一字符
/////////////////////////////////////////////
   
  
//存在两个字符情况,假如为la,则要弹出三个,假如是rb或者‘(’则只用弹出两个
   
   double b=nv.back();
   nv.pop_back();
   double a=nv.back();
    nv.pop_back();
  double c;
   if(!falg)
   {
    c=nv.back();
     nv.pop_back();
              //nv.push_back(b);
     double mid;
     mid=b;
     b=a;
     a=c;
     c=mid;
   }

   double num=complicate(a,b,&p);
   nv.push_back(num);

   if(!falg)
   {
    falg=true;
    nv.push_back(c);
   }
  }
 }
}

//封装一个压入函数
void push(char*&p,vector<char>&sv,vector<double>&nv)
{
double num;
             while(*p)
            {
    char pe=*p;
              if(*p==')')
     {
      p++;
      return ;
     }
     else
      if(Issign(p,num))
      { sv.push_back(pe); p++; }
      else
       nv.push_back(num);
                   
    }

 

}


void main()
{
vector<char> sv;
vector<double> nv;

char ch[40];
memset(ch,0,40);
cin.getline(ch,40);
char*p=ch;
while(*p)
{
 push(p,sv,nv);
 complicateEx(sv,nv);
}

cout<<nv.back();
}

原创粉丝点击