表达式求值的另一种方法是什么,表达式求值的另一种方法叫做

  表达式求值的另一种方法是什么,表达式求值的另一种方法叫做

  表达式的求值可以通过语法实现,中缀表达式可以通过堆栈直接转换成后缀表达式。那么就很容易找到表达式的值。

  粘贴下面的程序源代码:(可能有点长,呵呵:)

  主页面

  # include“stack . CPP”

  #includestack.h

  #包括iostream

  使用命名空间std

  *该功能有两个功能。

  * 1.输入中缀表达式。

  * 2.将中缀表达式转换为后缀表达式

  *形参是两个指针指向两个数组(一个存储数字,一个存储运算符)。

  *返回值是数字和运算符的总数(如果转换错误,返回-1)

  int change(double *Darra,char *Carra)

  int num=0;//记录公式中数字和运算符的总数

  char ch//临时存储,输入字符

  双斗;//暂存,输入号码

  Stack char mychar//存储运算符

  bool wchar=false//有没有非法字符?

   Cout 请输入一个表达式(为方便起见可以带一个空格),并以=结尾: n endl

  while( cin ch,=!=ch)

  开关(通道)

  大小写“0”:大小写“5”:

  案例“1”:案例“6”:

  案例“2”:案例“7”:

  案例“3”:案例“8”:

  案例“4”:案例“9”:

  num

  CIN . put back(ch);//如果是数字,就扔回去,用double数据打包。

  斗;

  cout dou结尾;//后缀表达式的部分输出

  darra[num]=dou;

  打破;

  案例“”:

  大小写-:

  大小写 * :

  案例“/”:

  而((!我的char。Isempty()) //堆栈不为空

  (mychar。Top()!=()//堆栈元素的顶部不是空括号

  ((mychar。Top()==*) (mychar。Top()==/) (ch== ) (ch==-))

  //栈顶运算符的优先级不低于输入的运算符。

  //如果满足以上三个条件,堆栈中的所有元素都会弹出。

  num

  cout mychar。Top()结束;//后缀表达式的部分输出

  Carra[num]=mychar。top();

  我的char。pop();

  我的char。推(ch);//如果没有,将访问操作符压入堆栈。

  打破;

  案例(:

  *试图解决省略号*的操作不成功。

  if(==Carra[num] num!=0)

  num

  cout“*”结束;

  卡拉[数字]= * ;

  我的char。推(();//遇到推入堆栈的左括号

  打破;

  案例“)”:

  如果(mychar。Isempty()) //确定括号是否匹配。

  Cou n 有多余的) .endl

  return-1;

  而(!我的char。Isempty()) //遇到右括号,弹出堆栈中的元素。

  If((==mychar。Top()) //直到遇到左括号

  我的char。pop();

  打破;

  Else //如果堆栈为空,仍然没有左括号,执行弹出操作时会出现错误,系统将退出。

  num

  cout mychar。Top()结束;//后缀表达式的部分输出

  Carra[num]=mychar。top();

  我的char。pop();

  打破;

  案例“”:

  打破;

  默认值://检测非法字符

  wchar=true

  而(!我的char。Isempty()) //输出堆栈中剩余的运算符。

  If((==mychar。Top()) //括号不匹配。

  “cou” n n有多余的“(“.”endl

  return-1;

  num

  cout mychar。Top()结束;//后缀表达式的部分输出

  Carra[num]=mychar。top();

  我的char。pop();

  If(0==num) //没有表达式输入

   Cou n 您尚未输入任何表达式.endl

  return-1;

  if(wchar)

  Cout (字符串中有非法字符);

  Couendl 以上是中缀表达式和相应的后缀表达式,;

  退货数量;

  *运算函数,取出数组中存储的符号和数字(后缀表达式),计算结果并返回。

  *参数:存储后缀表达式的两个数组头的地址(如果这里用了stack,那么后缀表达式从stack输出时顺序是完全颠倒的),后缀表达式的长度。

  *返回值:后缀表达式的求值结果。

  double Compute(char *Carra,double *Darra,int num)

  int I=1;//取后缀表达式的辅助变量

  双d1,D2;//暂存区中弹出的两个变量

  堆栈双分辨率;//存储数字的操作堆栈

  while( i=num)

  If(Carra[i]==) //如果I是无效运算符,则表示在后缀表达式中,I应该对应一个数字。

  RES . Push(Darra[I]);//数字堆叠

  Else //如果是运算符

  D1=Res . Top();

  RES . Pop();

  D2=Res . Top();

  RES . Pop();//从栈顶弹出两条数据进行计算

  开关(卡拉[i])

  案例“”:

  RES . Push(D1 D2);//计算后按回堆栈

  打破;

  大小写-:

  RES . Push(D2-D1);

  打破;

  大小写 * :

  RES . Push(D1 * D2);

  打破;

  案例“/”:

  if(0==d1)

  cout 请注意分母不能为零.恩德尔

  系统("暂停");

  退出(0);

  推动决议(D2/D1);

  打破;

  默认值:

  cout (计算)运算符匹配出错了.恩德尔

  退出(0);

  我;

  return Res . Top();//弹出栈中最后一个数字(计算结果)

  char Carra[S _ size];//装入运算符

  for(I=0;i S _ sizei ) //将储存运算符的数组做一个标记,以明确该下标所对应的是数字还是运算符

  carra[I]= 0 ;//若检测到卡拉[i]= ,则说明卡拉[我]中没有存入运算符,而达拉[我]中存储了一个数字

  cout * * * * * * * * * * * * * * * * * * * * * * * * * 一个简单表达式计算程序* * * * * * * * * * * * * * * * * * * * * " endl

  总部所在地的cout ——by

  cout 注意:请写全表达式,不要省略*,写负数时请写成 0 - x 的形式 n endl

  if( ( i=change(Darra,Carra) )==-1 ) //判断转换是否成功

   cout n转换失败.恩德尔

  系统("暂停");

  退出(0);

  其他

  cout 其计算结果为: n endl

  cout Compute(Carra,Darra,I)endl;//计算并输出结果

  系统("暂停");

  返回0;

  }

  stack.cpp

  模板类T

  bool Stack T :Isempty() //如果堆栈为空,则返回真实的否则返回错误.

  if(-1==top)

  返回真实的

  其他

  返回错误的

  模板类T

  void Stack T :Pop() //从堆栈顶部弹出元素

  if(top==-1)

  cout 弹出栈出错.恩德尔

  退出(0);

  top-;

  模板类T

  空堆栈T :Push(T ele) //将此元素推入堆栈。

  如果(顶部S_size)

  cout 栈溢出.恩德尔

  退出(0);

  顶;

  elem[top]=ele;

  模板类T

  T Stack T :Top() //返回栈顶元素。

  if(-1==top)

  cout 已至栈底.恩德尔

  //exit(0);

  return elem[top];

  模板类T

  int Stack T:Size()//返回堆栈中元素的个数。

  返回顶部;

  模板类T //清除堆栈中的所有元素

  void Stack T :clear()

  top=-1;

  #endif

  stack.h

  void Pop();//从堆栈顶部弹出一个元素

  空推(T elem);//将此元素推入堆栈。

  t Top();//返回堆栈的顶部元素。

  bool Isempty();//如果堆栈为空,则返回真实的否则返回错误.

  int Size();//返回堆栈中元素的数量。

  void clear();//清除堆栈中的所有元素

  私人:

  t elem[S _ size];

  栈顶

  #endif

  运行结果:

表达式求值的另一种方法是什么,表达式求值的另一种方法叫做