上次写的那个24点程序还没有搞定
现在打算从基层着手 先把表达式求值得我问题给解决了!那后面的都好办了
下面是我昨天晚上和刚才乱些一通的代码
还没有测试呢!
/**********************************************************
本算法采用的是“运算符号优先法”
用来对给定的表达式求值的过程
目前版本1.00!
**********************************************************/
//定义栈的数据类型
#define ADDSIZE 10
typedef struct
{
char *top;//指向栈顶的指针
char *base;//指向栈底的指针
int StackSize;//定义栈的大小
} Stack;
//栈的基本操作
void InitStack(Stack &);//初始化栈操作
void Push(Stack,char);//压栈
char GetTop(Stack);//得到栈顶元素
BOOL Compare(char);
int Operate(int,char,int);
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 '='://脱括号过程并接受下一个字符
Pop(OPTR,char x);
temp=Expression[++i];
break;
case '<'://退栈并将运算结果载入栈
Pop(OPTR,char Sign);
Pop(OPND,char Num1);
Pop(OPND,char Num2);
Push(OPND,Operate(Nnm1,Sign,Num2);
break;
}
}
return GetTop(OPND);
}
BOOL Compare(char IsOperatorNum)
{
//比较是否是操作数。。前提是操作数在0到12的范围内
//如果不在这个范围内的一律当运算符来看待
if((IsOperatorNum-48)>=0&&(IsOperatorNum-48)<=12)
{
return TRUE;
}
else
return FALSE;
}
int Operate(int num1,char sign,int num2)
{
if('+'==sign)
return num1+num2;
else if('-'==sign)
return num1-num2;
else if('*'==sign)
return num1*num2;
else
return num1/num2;
}
//比较运算符的优先级别 这步比较麻烦罗嗦
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.base=s.top;//栈顶为空
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;
top++;
}
char GetTop(Stack s)
{
//判断栈是否为空
if(s.base==s.top)
return ERROR;
char ch;//ch是用来保存
ch=s.top;
top--;
return ch;
}