做了一些改进,把栈的操作改为类了其他地方修改幅度都比较大,还没有调试,下次再来调试了。现把代码贴出来再说了!快停电了!!!! /********************************************************* 本算法采用的是“运算符号优先法” 用来对给定的表达式求值的过程 目前版本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; } 
|