应用题_简单表达式求值

正整数的四则混合运算

表达式合法字符有
0...9 + - * / ( ) =
必须以 = 结尾

应用举例
...
char exp[] = "((1+2)*3-4+5*6)/7=";
double result;
if( expression( exp , result ) )
{
 cout<<"result="<<result<<endl;
}
else
{
 cout<<"表达式有错"<<endl;
}
...


// 功能:正整数四则运算求值
// 时间:12:23 2005-10-2
// 最后修改时间:12:24 2005-10-2

#include "iostream.h"

#define max 1024

void solve( double num1 , double num2 , char op , double &ret )
{
 switch( op )
 {
 case '+':
  ret = num1 + num2;
  break;
 case '-':
  ret = num1 - num2;
  break;
 case '*':
  ret = num1 * num2;
  break;
 case '/':
  if( num2 != 0 )
   ret = num1 / num2;
  break;
 }
}

bool expression( char exp[] , double &ret )
{
 //操作符栈
 char opStack[max];
 int opTop = 0;
 //操作数栈
 double numStack[max];
 int numTop = 0;

 //记录两数的运算结果
 double result = 0;
 double num1;
 double num2;
 char op;

 //读入表达式的字符
 char ch;
 //表达式当前的字符指针
 int p = 0;

 //构造数字时用到
 double t;

 opStack[0] = '#';
 opTop = 1;
 ch = exp[p++];
 while( ch != '=' )
 {
  if( ch >= '0' && ch <= '9' )
  {
  //读入数字
   t = 0;
   while( ch >= '0' && ch <= '9' )
   {
    t = 10 * t + ( ch - '0' );
    ch = exp[p++];
   }
   numStack[numTop++] = t;
  }
  else if( ch == '(' )
  {
   opStack[opTop++] = ch;
   ch = exp[p++];
  }
  else if( ch == ')' )
  {
   //每次运算前检查是否有足够的操作数及操作符
   if( numTop <= 1 || opTop <= 1 )
    return false;
   num2 = numStack[--numTop];
   num1 = numStack[--numTop];
   op = opStack[--opTop];

   solve( num1 , num2 , op , result );

   numStack[numTop++] = result;

   //括号不匹配
   if( opStack[--opTop] != '(' )
    return false;

   ch = exp[p++];
  }
  else if( ( ch == '+' || ch == '-' )
   && opStack[opTop-1] != '('
   && opStack[opTop-1] != '#' )
  {
   if( numTop <= 1 || opTop <= 1 )
    return false;
   num2 = numStack[--numTop];
   num1 = numStack[--numTop];
   op = opStack[--opTop];

   solve( num1 , num2 , op , result );

   numStack[numTop++] = result;
  }
  else if( ( ch == '*' || ch == '/' )
   && ( opStack[opTop-1] == '+'
   || opStack[opTop-1] == '-' ) )
  {
   opStack[opTop++] = ch;
   ch = exp[p++];
  }
  else if( ( ch == '*' || ch == '/' )
   && ( opStack[opTop-1] == '*'
   || opStack[opTop-1] == '/' ) )
  {
   if( numTop <= 1 || opTop <= 1 )
    return false;
   num2 = numStack[--numTop];
   num1 = numStack[--numTop];
   op = opStack[--opTop];

   solve( num1 , num2 , op , result );

   numStack[numTop++] = result;
  }
  else
  {
   opStack[opTop++] = ch;
   ch = exp[p++];
  }
 }

 if( numTop <= 1 || opTop <= 1 )
  return false;

 num2 = numStack[--numTop];
 num1 = numStack[--numTop];
 op = opStack[--opTop];

 solve( num1 , num2 , op , result );

 numStack[numTop++] = result;

 ret = numStack[numTop-1];

 return true;
}
void main()
{
 char exp[] = "((1+2)*3-4+5*6)/7=";
 double ret;
 if( expression( exp , ret ) )
  cout<<"ret="<<ret<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值