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;
}
阅读更多
个人分类: interview
上一篇book-I
下一篇weekly October
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭