表达式计算 用栈完成

 

///
///表达式计算
////数据结构:栈
////作者:ZZJ_4Ever
///


#include 
< iostream >
#include 
< stack >
#include 
< string >
#include
< assert.h >
using   namespace  std;

stack
< double >  data_stack;
stack
< char >  char_stack;
int  PRI( char   & ch)
{
 
if(ch==')'){return 1;}
 
else if(ch=='+'||ch=='-'){return 2;}
 
else if(ch=='*'||ch=='/'){return 3;}
 
else return 0;
}

/*
2.扫描到操作符,与操作符栈的顶端操作符进行比较,
   如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈;
   如果优先级较大,则进操作符栈;
   如果是’(‘直接进栈,如果是’)’,遇到’(‘则抵消.
*/

void  Exc_stack()

 
 
double result_temp;
 assert(char_stack.size()
>=1&&data_stack.size()>=1);
 
double temp1=data_stack.top();
 data_stack.pop();
 
double temp2=data_stack.top();
 data_stack.pop();
 
char popchar=char_stack.top();
 char_stack.pop();
 
if(popchar=='+')
 result_temp
=temp2+temp1;
 
else if(popchar=='-')
 result_temp
=temp2-temp1;
 
else if(popchar=='*')
 result_temp
=temp2*temp1;
 
else if(popchar=='/')
 result_temp
=temp2/temp1;
 data_stack.push(result_temp);
}

void  push_charinto( char   & ch)

 
if(ch=='(')//如果是’(‘直接进栈
  char_stack.push(ch);
 
else if(char_stack.empty())
 
{
  char_stack.push(ch);
  
 }

 
else if(PRI(ch)>PRI(char_stack.top()))//如果优先级较大,则进操作符栈
 {
  char_stack.push(ch); 
 }

 
//扫描到操作符
 else//如果优先级小或相等,则弹出数据和操作符进行计算,将结果送入数据栈
 {
  
  Exc_stack();
  
  
if(ch==')')//如果是’)’,遇’(‘直接弹出.
  {
   
while(char_stack.top()!='(')//操作括号内的内容直到遇到'('为止
   {
    Exc_stack();
   }

   char_stack.pop();
  }

  
else
  
//将自己压入栈
  char_stack.push(ch);
 }
 
}

void  push_datainto( double   & db)
{

 data_stack.push(db);
}

void  main()
{
 
string str;
 
 
while(1)
 

  
bool flag=false;
  
double ret = 0.0;
  
double n ;
  cout
<<"在此输入表达式:";
  
//读 入 
  cin>>str;
  
//处理

  
//筛选
  
  
/////开始扫描
  
/// 

  for(int i=0;i<str.length();i++
  
{
   
   
if(str[i]>='0' && str[i]<='9')
   
{
    
if(!flag)
     ret 
= ret *10 + str[i]-'0';
    
else
    
{
     ret 
= ret + (str[i]-'0')/n;
     n
*=10;
    }

   }

   
else if(str[i] == '.')
   
{
    n 
= 10;
    flag 
= true;
   }

   
else
   
{
    
if(ret!=0 || str[i-1]=='0')
    push_datainto(ret); 
    ret
=0.0;
    flag 
= false;
    push_charinto(str[i]);
   }

  
  }

  
//如果最后一个数字还没有压入栈
  if(ret!=0||str[i-1]=='0')push_datainto(ret);
  
//3.扫描数据完成后,依次退栈并进行计算
  assert(!data_stack.empty()||!char_stack.empty());
  
while(data_stack.size()!=1)
  
{
   Exc_stack();
  }

 
// double rre=data_stack.top();
  cout<<"结果:"<<data_stack.top()<<endl;
  data_stack.pop();
 }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值