表达式求值

来源:互联网 发布:电脑连接摄像头软件 编辑:程序博客网 时间:2024/06/05 22:44

自己写的乱七八糟的代码。。


#include <iostream>#include <cstring>#include <string>#include <map>#include <cmath>using namespace std;int toint(const char* str,int length){int i=0;int ans=0;int s;  for (i=0;i<=length-1;i++)  {  s=pow(10,length-1-i);  ans+=(str[i]-'0')*s;  }  return ans;}class Calculator{public:int getResult(const char* str){char ope[100];int num[100];int length1=0,length2=0;int length=strlen(str);int counter=0;int pos=0;int flag=0;int temppos;    while (pos!=length)    {  while (str[pos]>='0' && str[pos]<='9')  {  if (counter==0)  temppos=pos;  pos++;  counter++;  flag=1;  }  if (flag)  {    num[length2++]=toint(str+temppos,counter);    counter=0;    flag=0;    if (ope[length1-1]=='*' )    {    num[length2-2]=num[length2-2]*num[length2-1];    length1--;    length2--;    }    else if (ope[length1-1]=='/')    {    num[length2-2]=num[length2-2]/num[length2-1];    length1--;    length2--;    }  }  if (pos!=length)  {  flag=0;          ope[length1++]=str[pos];          pos++;  if (ope[length1-1]=='+' || ope[length1-1]=='-' )  {            if (length1-2>=0 && ope[length1-2]=='+')            {            num[length2-2]=num[length2-1]+num[length2-2];            length2--;            ope[length1-2]=ope[length1-1];            length1--;            }            else if (length1-2>=0 && ope[length1-2]=='-')            {            num[length2-2]=num[length2-2]-num[length2-1];            length2--;            ope[length1-2]=ope[length1-1];            length1--;            }  }  else if (ope[length1-1]=='*' || ope[length1-1]=='/')  {  if (length1-2>=0 && ope[length1-2]=='*')  {    num[length2-2]=num[length2-2]*num[length2-1];    length2--;    ope[length1-2]=ope[length1-1];    length1--;  }    else if (length1-2>=0 && ope[length1-2]=='/')  {    num[length2-2]=num[length2-2]/num[length2-1];    length2--;    ope[length1-2]=ope[length1-1];    length1--;  }  }  else if (ope[length1-1]==')')  {            if (length1-2>=0 && ope[length1-2]=='+')            {            num[length2-2]=num[length2-1]+num[length2-2];              length1=length1-3;              length2--;            }            else if (length1-2>=0 && ope[length1-2]=='-')            {            num[length2-2]=num[length2-2]-num[length2-1];              length1=length1-3;              length2--;            }            else if (length1-2>=0 && ope[length1-2]=='*')            {            num[length2-2]=num[length2-1]*num[length2-2];              length1=length1-3;              length2--;            }            else if (length1-2>=0 && ope[length1-2]=='/')            {            num[length2-2]=num[length2-2]/num[length2-1];              length1=length1-3;              length2--;            }            else            {            length1=length1-2;            }  }  }    }  if (length1!=0)  {    if (ope[0]=='+')    num[0]=num[0]+num[1];    else if (ope[0]=='-')    num[0]=num[0]-num[1];    else if (ope[0]=='/')    num[0]=num[0]/num[1];    else if (ope[0]=='*')    num[0]=num[0]*num[1];  }  return num[0];}};int main(){Calculator c;cout<<c.getResult("1+2+3")<<endl;cout<<c.getResult("((3+4)*5+6)*7")<<endl;cout<<c.getResult("1+2*3")<<endl;cout<<c.getResult("2*5+10")<<endl;cout<<c.getResult("3*(5+4)")<<endl;cout<<c.getResult("(4+5)*(2+2)")<<endl;cout<<c.getResult("1/2+1/2")<<endl;cout<<c.getResult("0+0")<<endl;cout<<c.getResult("4*5-7*8")<<endl;cout<<c.getResult("378+456-500*12/2")<<endl;cout<<c.getResult("((11*(12+13)*(14+15))+(16+17))*(18+19)")<<endl;cout<<c.getResult("4+5")<<endl;cout<<c.getResult("4")<<endl;cout<<c.getResult("77+44-22*33/11")<<endl;  return 0;}

标准代码

#include <iostream>#include <string>#include <stack>#include <cctype>using namespace std;class Calculator{public:Calculator(){};int getResult(string);private:bool can_do(char c);void exe_cacu();void set(string);string exp;stack<int> number;stack<char> op;};void Calculator::set(string s){exp = s;while(!number.empty())number.pop();while(!op.empty()) op.pop();}bool Calculator::can_do(char c){if(op.empty()) return false;if(op.top() == '(')return false;if(c == '+' || c == '-')return true;if(c == '*' && (op.top() == '*' || op.top() == '/'))return true;if(c == '/' && (op.top() == '*' || op.top() == '/'))return true;return false;}void Calculator::exe_cacu(){int b = number.top();number.pop();int a = number.top();number.pop();int result;switch(op.top()){case '+':result = a+b;break;case '-':result = a-b;break;case '*':result = a*b;break;case '/':result = a/b;break;}number.push(result);op.pop();}int Calculator::getResult(string s){set(s);int temp = 0;for(unsigned int i=0; i<exp.length(); i++){if(isdigit(exp[i])){temp = temp*10 + exp[i]-'0';if(i+1 == exp.length() || !isdigit(exp[i+1])){number.push(temp);temp = 0;}}else if(exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/'){if(can_do(exp[i]))exe_cacu();op.push(exp[i]);}else if(exp[i] == '(')op.push(exp[i]);else{while(op.top() != '(')exe_cacu();op.pop();}}while(!op.empty())exe_cacu();return number.top();}


原创粉丝点击