表达式的计算

来源:互联网 发布:linux 显示绝对路径 编辑:程序博客网 时间:2024/05/23 11:21

 

//writen by sunboy
//2007.6.30
#include <iostream>
#include 
<string>
#include 
<vector>
using namespace std;
vector 
<string> vec_num,vec_symbol;
string transform(string headExp);      //将中缀表达式转化为后缀表达式
int CalrearExp(vector <string> &vec);  //计算后缀表达式的值
int stringToint(string s)
{
  
int res=0,i;
  
int len=s.length();
  
for(i=0;i<len;i++)
  
{
 res
*=10;
    res
+=(s[i]-'0');
    }

return res;
}


int main()
{
    
string  headExp,rearExp;
 
int ans;
 cout
<<"请输入表达式:"<<endl;
    cin
>>headExp;
    rearExp
=transform(headExp);
 cout
<<rearExp<<endl;
    ans
=CalrearExp(vec_num);
    cout
<<ans<<endl;
    
  
return 0;
}


/*
  中缀算术表达式转后缀算术表达式
  算法:

     1 读入运算对象,直接输出

     2 ( 运算符进栈

     3 ) 运算符,栈内的最上一个( 以上的运算符退栈,(也退栈
     
     4 读入运算符,进入运算栈
      
       4.1 后进栈的运算符 > 先进栈的运算符,运算符进栈  (优先级比较)
     
       4.2 后进栈的运算符 <= 先进栈的运算符,将栈内的运算符退栈输出,再进栈


     5 # 结束符

 
*/

string transform(string headExp)
{
  
string res,tmp;
  
  
int i,j,len=headExp.length();
  i
=0;
  
char ch;
  
int top;
  
while(i<len)
  
{
  ch
=headExp[i++];
  
switch(ch)
  
{
  
case '(':
   vec_symbol.push_back (
"(");
       
break;
  
case ')':
    top
=vec_symbol.size ();
    j
=top-1;
          
while(vec_symbol[j]!="(")
    
{
      vec_num.push_back (vec_symbol[j]);
   vec_symbol.erase(vec_symbol.begin ()
+j);
      j
--;
    }

    vec_symbol.erase(vec_symbol.begin ()
+j);
   
break;
  
case '+':
     
case '-':
   top
=vec_symbol.size ();
    j
=top-1;
          
while(j>=0&&vec_symbol[j]!="(")
    
{
      vec_num.push_back (vec_symbol[j]);
   vec_symbol.erase(vec_symbol.begin ()
+j);
      j
--;
    }

          
if(ch=='+')
        vec_symbol.push_back (
"+");
    
else 
     vec_symbol.push_back (
"-");
   
break;
  
case '*':
  
case '/':
          top
=vec_symbol.size ();
    j
=top-1;
          
while(j>=0&&vec_symbol[j]=="*"||vec_symbol[j]=="/")
    
{
      vec_num.push_back (vec_symbol[j]);
   vec_symbol.erase(vec_symbol.begin ()
+j);
      j
--;
    }

          
if(ch=='*')
        vec_symbol.push_back (
"*");
    
else 
     vec_symbol.push_back (
"/");

   
break;
  
default:
   tmp
="";
   
while(ch>='0'&&ch<='9')
   
{
     tmp
+=ch;
     ch
=headExp[i++];
   }

   i
--;
   vec_num.push_back (tmp);
  }
  
  }

for(i=vec_symbol.size ()-1;i>=0;i--)
     vec_num.push_back (vec_symbol[i]);
for(i=0;i<vec_num.size ();i++)
{
 res
+=vec_num[i];
    res
+=" ";
}

  
return res;
}


 


int CalrearExp(vector <string> &vec)
{
   
int res,i;
   vector
<int> vec_cal;

   
int len=vec.size ();
   
for(i=0;i<len;i++)
   
{
      
if(vec[i]=="+")
   
{
  vec_cal[vec_cal.size ()
-2]=vec_cal[vec_cal.size ()-2]+vec_cal[vec_cal.size ()-1];
     vec_cal.erase (vec_cal.begin ()
+vec_cal.size ()-1);
   }
else if(vec[i]=="-")
   
{
     vec_cal[vec_cal.size ()
-2]=vec_cal[vec_cal.size ()-2]-vec_cal[vec_cal.size ()-1];
     vec_cal.erase (vec_cal.begin ()
+vec_cal.size ()-1);
   }
else if(vec[i]=="*")
   
{
     vec_cal[vec_cal.size ()
-2]=vec_cal[vec_cal.size ()-2]*vec_cal[vec_cal.size ()-1];
     vec_cal.erase (vec_cal.begin ()
+vec_cal.size ()-1);
   }
else if(vec[i]=="/")
   
{
     
if(vec_cal[vec_cal.size ()-1]==0)
     

      cout
<<"除零错误"<<endl;
      vec_cal[vec_cal.size ()
-1]=1;
   }

   vec_cal[vec_cal.size ()
-2]=vec_cal[vec_cal.size ()-2]/vec_cal[vec_cal.size ()-1];
   vec_cal.erase (vec_cal.begin ()
+vec_cal.size ()-1);
   }
else
   
{
    
int num=stringToint(vec[i]);
     vec_cal.push_back (num);
   }

   
   }

   res
=vec_cal[0];
   
return res;
}