表达式求值
/*** 功能:表达式求值(0到9)* 时间:2014年6月15日08:02:31* 作者:cutter_point*/#include#include #include #include using namespace std;stack intStack; //存放数值的栈stack 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<<"结果是:"< < >s) { cout<<"计算结果是:"<
測试数据:
9+8/4*(2+1)/2#
输出结果是:
12
这个表达式哪里来的?反正不是我自己想的,是一位大神用来測试他的算术表达式的,我就拿来測试我的程序呗
注意:输入表达式后一定要加一个#才干够!!!