修改的表达式求值的代码

类别:编程语言 点击:0 评论:0 推荐:
做了一些改进,把栈的操作改为类了其他地方修改幅度都比较大,还没有调试,下次再来调试了。现把代码贴出来再说了!快停电了!!!!

/*********************************************************
本算法采用的是“运算符号优先法”
用来对给定的表达式求值的过程
目前版本1.00!------NavyBlueStudio
欢迎来到我的blog http://blog.csdn.net/navyblue1982
*********************************************************/
int Compare(string);
string Operate(string,string,string);
char Precede(string,string);

//实现部分

//EvaluateExpression函数主要完成表达式求值问题
//Expression是要求值的表达式传递的值
int EvaluateExpression(string* Expression)

 //用OPTR来保存操作符,OPND来保存
 Stack OPTR,OPND;
 push(OPTR,"#");//#符号表示栈底

 //定义temp来保存临时的符号或操作数
 string temp;
 int i=0;
 temp=Expression[i];

 //判断如果是 ##那么结束循环
 while(GetTop(OPTR)!="#"||temp!="#")
 {
  //Compare是用来比较是操作数还是操作符的如果是操作数返回TRUE如果是操作符返回FALSE
  //这里不需要注意返回值为0的情况,因为做的是24点游戏,最小值为1,可以偷点懒嘎嘎
  if(Compare(temp))
  {
   Push(OPND,temp);
   temp=Expression[++i];
  }
  else
   //Precede用来比较栈顶操作符和新的操作符的优先级
   switch(Precede(GetTop(OPTR),temp))
  {
   case '<'://栈顶的优先级低
    Push(OPTR,temp);
    temp=Expression[++i];
    break;
   case '='://脱括号过程并接受下一个字符
    string x;
    Pop(OPTR,x);
    temp=Expression[++i];
    break;
   case '>'://退栈并将运算结果载入栈
    string Sign;
    string Num1,Num2;
    Pop(OPTR,Sign);
    Pop(OPND,Num1);
    Pop(OPND,Num2);
    Push(OPND,Operate(Num1,Sign,Num2));//找到问题了,要把数字转换为字符形式

    break;
  }
 }
 string ReturnValue=GetTop(OPND);
 return atoi(ReturnValue)://返回栈底部的元素也就是要求的结果

}
int Compare(string IsOperatorNum)
{
 //比较是否是操作数。。前提是操作数在0到12的范围内
 //如果不在这个范围内的一律当运算符来看待
 Select=atoi(IsOperatorNum);
 if(0==Select)
  return FALSE;
 else
  return TRUE;

}

string Operate(string num1,string sign,string num2)
{
 //注意要返回字符型的
 //先转换为数值型 再转换为字符行返回
 int integer1,integer2;
 integer1=atoi(num1);
 integer2=atoi(num2);
 char Sign=sign[0];
 //定义返回值
 string returnvalue;
 if('+'==Sign)
 {
  itoa((integer1+integer2),returnvalue,10);
  return returnvalue;
 }
 else if('-'==Sign)
 {
  itoa((integer1-integer2),returnvalue,10);
  return returnvalue;
 }
 else if('*'==Sign)
 {
  itoa(integer1*integer2,returnvalue,10);
  return returnvalue;
 }
 else
 {
  itoa(integer1/integer2,returnvalue,10);
  return returnvalue;
 }
}
//比较运算符的优先级别 这步比较麻烦罗嗦
char Precede(string sign1,string sign2)
{
 char Sign1,Sign2;//把传递的字符串转换为字符型
 Sign1=sign1[0];
 Sign2=sign[0];
 switch(Sign1)
 {
 case '+':
 case '-':
  switch(Sign2)
  {
  case '+':
  case '-':
  case ')':
  case'#':
   return '>';
  case '*':
  case '/':
  case '(':
   return '<';
  }
 case '*':
 case '/':
  switch(Sign2)
  {
  case '+':
  case '-':
  case '*':
  case '/':
  case ')':
  case '#':
   return '>';
  case '(':
   return '<';
  }
 case '(':
  switch(Sign2)
  {
  case ')':
   return '=';
  default:
   return '<';
  }
 case ')':
  return '>';
 case '#':
  switch(Sign2)
  {
  case '#':
   return '=';
  default:
   return '<';
  }
 }
}

int main()
{
 //测试程序  由于本程序采用的是字符串形式的栈 故而不不能存放大于二位数的值
 //所以再一次计算中要是出现二位数的数值那么结果将会出现错误
 //明天来改进一下,采用字符数组的形式或双字符串的大小来存放元素
 string temp[16]={"12","*","56"+","(","34","-","5",")","#"}

  int m=EvaluateExpression(temp);
 int j=m-48;
 std::cout<<"您要求的表达式的值为:"<<j<<std::endl;
 return 0;
 }

////////////////////栈的实现

class Stack
{
public:
 Stack();
 string GetTop();
 BOOL Push(string);
 BOOL Pop(string);
private:
 int top;
 int base;
 string str[16];
};
////////实现部分
Stack::Stack()
{
 top=base=0;
}
string Stack:: GetTop()
{
 if(top==base)return FALSE;
 else
  return str[top-1];
}
BOOL Stack::Push(string S)
{
 if(top>15)return FALSE;
 else if(top==15)
  str[top]=S;
 return TRUE;
 else
  str[top++]=S;
 return TRUE;
}
BOOL Stack::Pop(String &S)
{
 if(top==base)return FALSE;
 else
  S=str[top--];
 return TRUE;
}

本文地址:http://com.8s8s.com/it/it22288.htm