【足迹C++primer】表达式求值
表达式求值
/** * 功能:表达式求值(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
PS:蛋疼死了,明明早就成功了,结果codeblocks由于路径不能是中文搞得我没法调试,浪费时间,还有就是開始得到的老是错误结果,然后我就把程序断点运行了一遍之后,就该了一块地方,可是我认为应该没影响的地方啊!!!然后竟然就成功了!!!!吓尿,还有就是一定要输入完算术表达式后加一个#表示输入结束,不然是得不到正确结果的!!!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。