/*********************************************************
本算法采用的是“运算符号优先法”
用来对给定的表达式求值的过程
目前版本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