表达式计算之三:计算

#include <string>
#include "DataType.h"
#include "NumType.h"
using namespace std;

nums compute(string sInfix)
{
    string sSuffix;
    sSuffix.clear();
    stack<char>aChar;
    int iL=sInfix.length(),iI=0;
    while (iI<iL)
    {
         if ((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.'))
         {
              while ((iI<iL)&&((isdigit(sInfix.at(iI)))||(sInfix.at(iI)=='.')))
              {
                   sSuffix.append(1,sInfix.at(iI++));
              }
              iI--;
              sSuffix.append(1,',');
         }
                 
         if (sInfix.at(iI)=='(')
         {
              aChar.push('(');
         }     
         if (sInfix.at(iI)==')')  
         {
              while (aChar.top()!='(')
              {
                   sSuffix.append(1,aChar.pop());
              } 
              aChar.pop();
         }
         if ((sInfix.at(iI)=='-')&&((iI==0)||(!isdigit(sInfix.at(iI-1)))))
         {           
              sSuffix.append(1,'_');
         }
         else if ((sInfix.at(iI)=='+')||(sInfix.at(iI)=='-')||(sInfix.at(iI)=='*')||(sInfix.at(iI)=='/'))                                                                                
         {
              while (vs(sInfix.at(iI))<=vs(aChar.top()))
              {
                    sSuffix.append(1,aChar.pop());
              }
              aChar.push(sInfix.at(iI));
         }           
         iI++;
    }   
    while (!aChar.empty())
    {
         sSuffix.append(1,aChar.pop());
    }
    iI=0;
    iL=sSuffix.length();     
    stack <nums> aNums;
    while (iI<iL)
    {
         if (isdigit(sSuffix.at(iI)))
         {
              long iJ=0,iAt=iI,iT=1,iNum=0,iFlag=0;
              nums nT;
              while (sSuffix.at(iI)!=',')
              {
                   if (isdigit(sSuffix.at(iI))) 
                   {
                        if (iFlag==0)                        
                        {
                             iNum=iNum*10+sSuffix.at(iI++)-'0';
                        }
                        else
                        {
                             iNum=iNum*10+sSuffix.at(iI++)-'0';
                             iJ++;
                        }
                   }  
                   else if (sSuffix.at(iI)=='.')
                   {
                        iFlag=1;
                        iI++;
                   }   
              }  
              if (iAt>0)   
              {
                   if (sSuffix.at(iAt-1)=='_')
                   {          
                        iNum=-iNum;
                   }
              }
              if (iJ>0)
              {
                   for (iAt=1;iAt<=iJ;iAt++)
                   {
                       iT*=10;
                   }
              }
              nT.record(iNum,iT);
              aNums.push(nT); 
         }       
         if (sSuffix.at(iI)=='+')
         {
              nums nT1,nT2,nT3;
              nT1=aNums.pop();
              nT2=aNums.pop();    
              nT3=nT1+nT2;
              aNums.push(nT3);
         }      
         if (sSuffix.at(iI)=='-')
         {
              nums nT1,nT2,nT3;
              nT1=aNums.pop();     
              nT2=aNums.pop();  
              nT3=nT2-nT1;
              aNums.push(nT3);
         }      
         if (sSuffix.at(iI)=='*')
         {
              nums nT1,nT2,nT3;
              nT1=aNums.pop();     
              nT2=aNums.pop();  
              nT3=nT1*nT2;
              aNums.push(nT3);
         }      
         if (sSuffix.at(iI)=='/')
         {
              nums nT1,nT2,nT3;
              nT1=aNums.pop();     
              nT2=aNums.pop();  
              nT3=nT2/nT1;
              aNums.push(nT3);
         }      
         iI++;
    }
    return aNums.pop();                                                                                            
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值