表达式求值调试完成

来源:互联网 发布:86版西游记知乎 编辑:程序博客网 时间:2024/05/16 15:22

原来调试程序比写程序难多了!

花了不到2个小时写完的程序,调试花了我快4个小时,还有很多不完美,下一不是让程序支持二位数的运算!

调试过程我也就不想写了,太辛苦了!

下面是我修改的结果

哎~·最近又要和字符串打交道了! 

/**********************************************************
本算法采用的是“运算符号优先法”
用来对给定的表达式求值的过程
目前版本1.00!------NavyBlueStudio
**********************************************************/
///////////////////////////////////////////////////////////////////
#include<iostream>
//#include<wingdi.h>                                           
//定义栈的数据类型                                            
#define ADDSIZE 10
#define ERROR 0
#define FALSE 0
#define OVERFLOW 0
#define TRUE 1
typedef struct
{
 char *top;//指向栈顶的指针
 char *base;//指向栈底的指针
 int StackSize;//定义栈的大小
} Stack;
//栈的基本操作
void InitStack(Stack &);//初始化栈操作
void push(Stack&,char);//压栈
char GetTop(Stack);//得到栈顶元素
void Pop(Stack&,char&);

int Compare(char);
char Operate(char,char,char);
char Precede(char,char);
/////////////////////////////////////////////////////////////////////////////////////////

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

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


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

 //判断如果是 ##那么结束循环
 while(GetTop(OPTR)!='#'||temp!='#')
 {
  //Compare是用来比较是操作数还是操作符的如果是操作数返回TRUE如果是操作符返回FALSE
  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 '='://脱括号过程并接受下一个字符
    char x;
    Pop(OPTR,x);
    temp=Expression[++i];
    break;
   case '>'://退栈并将运算结果载入栈
    char Sign;
    char Num1,Num2;
    Pop(OPTR,Sign);
    Pop(OPND,Num1);
    Pop(OPND,Num2);
    push(OPND,Operate(Num1,Sign,Num2));//找到问题了,要把数字转换为字符形式

    break;
  }
 }
 return GetTop(OPND);
}
int Compare(char IsOperatorNum)
{
 //比较是否是操作数。。前提是操作数在0到12的范围内
 //如果不在这个范围内的一律当运算符来看待
 if((IsOperatorNum-48)>=0&&(IsOperatorNum-48)<=12)
 {
  return TRUE;
 }
 else
  return FALSE;
}

char Operate(char num1,char sign,char num2)
{
 //注意要返回字符型的
 //先转换为数值型 再转换为字符行返回
 int integer1,integer2;
 integer1=num1-48;
 integer2=num2-48;
 if('+'==sign)
  return (integer1+integer2)+48;
 else if('-'==sign)
  return (integer1-integer2)+48;
 else if('*'==sign)
  return integer1*integer2+48;
 else
  return integer1/integer2+48;
}
//比较运算符的优先级别 这步比较麻烦罗嗦
char Precede(char sign1,char sign2)
{
 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 '<';
  }
 }
}

void InitStack(Stack &s)
{
 //到时候注意点
 s.base=(char*)malloc(16*sizeof(char));
 if(!(s.base))exit(OVERFLOW);//分配失败
 s.top=s.base;//栈顶为空
 s.StackSize=16;
}

void push(Stack &s,char sign)
{
 //开始判断栈是否满了
 if((s.top-s.base)>=s.StackSize)
 {
  //如果满了 追加存储空间
  s.base=(char*)realloc(s.base,(s.StackSize+ADDSIZE)*sizeof(char));
  if(!(s.base))
   exit(OVERFLOW);
  s.top=s.base+s.StackSize;
  s.StackSize+=ADDSIZE;
 }
 *(s.top++)=sign;
}
char GetTop(Stack s)
{
 //判断栈是否为空
 if(s.base==s.top)
  return 0;
 char ch;//ch是用来保存
 ch=*(s.top-1);//这里有问题 晚上来调试了 别把我的给搞乱了

 return ch;
}

void Pop(Stack& s,char &receive)
{
 if(s.top==s.base)
  exit(0);
 receive=*(s.top-1);
 s.top--;

}

int main()
{
 //测试程序  由于本程序采用的是字符串形式的栈 故而不不能存放大于二位数的值
 //所以再一次计算中要是出现二位数的数值那么结果将会出现错误
 //明天来改进一下,采用字符数组的形式或双字符串的大小来存放元素
 char* temp="1*(2+4)*2#";
 char m=EvaluateExpression(temp);
    int j=m-48;
 std::cout<<"您要求的表达式的值为:"<<j<<std::endl;
 return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////

原创粉丝点击