表达式求值
/** * 功能:表达式求值(0到9) * 时间:2014年6月15日08:02:31 * 作者:cutter_point */ #include<stdlib.h> #include<stack> #include<iostream> #include<string> using namespace std; stack<int> intStack; //存放数值的栈 stack<char> charStack; //存放运算符 string OP="+-*/()#"; //等会用finf_first_of来找出来所有的数 string shuzhi="0123456789"; //判断运算符的优先级,c1表示前面元素,c2在c1之后 char isFirst(char c1, char c2) { char res='#'; switch(c1) { case '+': case '-': //判断前面是+和-的情况 switch(c2) { case '+': case '-': case ')': case '#': res='>'; //加减的优先级比他们高,碰到就让前面的出栈计算 break; case '*': case '/': case '(': res='<'; //加减的优先级比他们低,当碰到的时候直接进栈 break; } break; case '*': case '/': //判断前面是*和/的情况 switch(c2) { case '(': res='<'; break; default: res='>'; break; } break; case '(': switch(c2) { case ')': res='='; break; default: res='<'; break; } break; case ')': res='>'; break; case '#': switch(c2) { case '#': res='='; break; default: res='<'; break; } break; } return res; } //判断是否是运算符 bool In(char c, string OP) { bool b=false; for(string::iterator it=OP.begin() ; it != OP.end() ; ++it) { if(c == *it) { b=true; break; } } return b; } //得到计算结果 int countResult(int a, char opera, int b) { int res=0; switch(opera) { case '+': res=a+b; break; case '-': res=a-b; break; case '*': res=a*b; break; case '/': res=a/b; break; } return res; } int result(string s) { //得到算术表达式的值 //首先让charStack栈的栈顶变为'#' charStack.push('#'); //循环对栈进行操作 string::iterator it=s.begin(); while(it != s.end()) { if(!In(*it, OP)) { //首先把字符转化成数字 int a=*it-'0'; intStack.push(a); ++it; } else { switch(isFirst(charStack.top(), *it)) { case '<': //优先级比前面的小,那就直接进栈 charStack.push(*it); ++it; break; case '=': charStack.pop();//弹出栈顶元素,脱括号继续循环 ++it; break; case '>': //对栈进行各种操作,退栈并将运算结果入栈 int b=intStack.top(); //得到前面一个数值 intStack.pop(); //吧栈顶的元素删除 int a=intStack.top(); //得到第二个数字 intStack.pop(); //删除栈顶元素 //取出运算符号 char opera=charStack.top(); //得到栈顶元素 charStack.pop(); //删除栈顶元素 //进行计算 intStack.push(countResult(a, opera, b)); break; }//switch }//else }//while cout<<"结果是:"<<intStack.top()<<endl; return intStack.top(); } /* //找到string看是否是运算符 bool isYunSuanFu(string s) { bool b=false; string::size_type pos=0; if(pos=s.find_first_of(OP, pos) != string::npos) { b=true; } return b; } */ int main() { string s; cout<<"输入算术表达式:"<<endl; while(cin>>s) { cout<<"计算结果是:"<<endl; cout<<result(s)<<endl; } // string::size_type pos=0; // shuzhi.erase(pos,1); 删除的结果是123456789 // cout<<shuzhi; return 0; } //蛋疼调试结束:2014年6月15日11:53:01
测试数据:
9+8/4*(2+1)/2#
输出结果是:
12
这个表达式哪里来的?反正不是我自己想的,是一位大神用来测试他的算术表达式的,我就拿来测试我的程序呗
注意:输入表达式后一定要加一个#才可以!!!
PS:蛋疼死了,明明早就成功了,结果codeblocks因为路径不能是中文搞得我没法调试,浪费时间,还有就是开始得到的老是错误结果,然后我就把程序断点执行了一遍之后,就该了一块地方,但是我觉得应该没影响的地方啊!!!然后居然就成功了!!!!吓尿,还有就是一定要输入完算术表达式后加一个#表示输入结束,不然是得不到正确结果的!!!