source book

/***     只适合整数的表达式求值  ***/
/***其中部分可作修改,表达式也可是输入的***/
#include "iostream.h"
const int n0=30;
int s1[n0+1]; //操作数栈
char s2[n0+1]; //运算符栈
int t1,t2;
int num[4];  //提取表达式中的整数


void calcu() //一次计算
{
 int x1,x2,x;
 char p;
 //弹出一个运算符
 p=s2[t2--];
 //弹出两个操作数
 x2=s1[t1--];
 x1=s1[t1--];
 //进行一次运算
 switch(p) {
 case '+':x=x1+x2;break;
 case '-':x=x1-x2;break;
 case '*':x=x1*x2;break;
 case '/':x=x1/x2;
 }
 //结果压入操作数栈
 s1[++t1]=x;
}


int calculator(char *f)
{
 int v,i=0;
 char *p=f;
 t1=t2=0;  //设置空栈
 while (*p!='\0')
 switch(*p) {
 case '+': case '-':
  while (t2&&(s2[t2]!='('))
  //执行先遇到的加、减、乘、除运算
  calcu();
  //当前运算符进栈
  s2[++t2]=*p;
  //读下一个字符
  p++;   
  break;
 case '*': case '/':
  if (t2&&(s2[t2]=='*')||(s2[t2]=='/'))
  //执行先遇到的乘、除运算
   calcu();
  //当前运算符进栈
  s2[++t2]=*p;
  //读下一个字符
  p++;
  break;
 case '(':
  //左括号进栈
  s2[++t2]=*p;
  //读下一个字符
  p++;
  break;
 case ')':
  while (s2[t2]!='(')
  //执行括号内的加、减、乘、除运算
   calcu();
  //弹出左括号
  t2--;
  //读下一个字符
  p++;
  break;
 default:
  //把字符串转换成整数值
  v=0;
  do {
   v=10*v+*p-'0';
   p++;
  } while((*p>='0')&&(*p<='9'));
  //操作数进栈
  s1[++t1]=v;
  num[i++]=v;
 };
 //执行先遇到的加、减、乘、除运算
 while (t2) calcu();
 //返回结果
 return s1[t1];
}


void main()
{
 char a[]="5*(40+6)-39";
 cout<<calculator(a)<<endl;
 cout<<"其中的数字为:\n";
 for (int i=0;i<4;i++)
 {
  cout<<num[i]<<' ';
 }
 cout<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值