描述 Description 给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值 数据可能会出现括号情况 还有可能出现多余括号情况 数据保证不会出现>maxlongint的数据 数据可能回出现负数情况
输入格式 Input Format 仅一行,即为表达式
输出格式 Output Format 仅一行,既为表达式算出的结果
时间限制 Time Limitation 各个测试点1s
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<stack> #include<cctype> #include<cstdlib> using namespace std; const __int64 N=1000; char _stack[N];//运算符的栈 __int64 top;//初始化为-1 void _pre(string &str)//处理负号1--2->1-(0-2) 1*-2->1*(0-2) 1---2->1-(0-(0-2)) { string res; for(__int64 i=0,len=str.size();i<len;i++) { if(str[i]=='-'|str[i]=='+') { if(i==0||(i>0&&(str[i-1]=='-'||str[i-1]=='+'||str[i-1]=='('))) { int cnt=0; for(int j=i;j<len;cnt++,j++) if(isdigit(str[j])) break; for(;!isdigit(str[i]);i++) { res+="(0";res+=str[i]; } for(;isdigit(str[i]);i++) res+=str[i];i--; while(cnt--) res+=')'; } else res+=str[i]; } else res+=str[i]; } str=res; } __int64 _pow(__int64 x,__int64 y) { if(y==0) return 1; if(y==1) return x; __int64 cnt; cnt=_pow(x,y/2); cnt=cnt*cnt; if(y&1) cnt*=x; return cnt; } void _change(string &str,string &res)//第一个参数为中缀表达式,第二个为后缀表达式,初始为空 { top=-1; __int64 len=str.size(); for(__int64 i=0;i<len;i++) { switch(str[i]) { case '(':_stack[++top]='(';break;
case '+': case '-':while(top>=0&&_stack[top]!='(') res+=_stack[top--]; _stack[++top]=' ';//空格很重要 分隔数字的 _stack[++top]=str[i]; break;
case '*': case '/':while(top>=0&&_stack[top]!='('&&_stack[top]!='+'&&_stack[top]!='-') res+=_stack[top--]; _stack[++top]=' '; _stack[++top]=str[i]; break;
case '^':while(top>=0&&_stack[top]!='('&&_stack[top]!='+'&&_stack[top]!='-'&&_stack[top]!='*'&&_stack[top]!='/') res+=_stack[top--]; _stack[++top]=' '; _stack[++top]=str[i]; break;
case ')':while(_stack[top]!='(') res+=_stack[top--]; top--; break; default:res+=str[i]; if(i==len-1) res+=' '; else if(!isdigit(str[i+1])) res+=' '; } } while(top>=0) { res+=_stack[top--]; } } __int64 atoint64(string str) { __int64 cnt=0; for(int i=0,len=str.size();i<len;i++) cnt=cnt*10+str[i]-'0'; return cnt; } __int64 _value(string str)//参数为后缀表达式 { __int64 cnt,len=str.size(); top=-1; __int64 _digit[N]; for(__int64 i=0;i<len;i++) { switch(str[i]) { case '('://左面多余括号 case ' ':break;//空格很重要 分隔数字的 case '+':cnt=_digit[top-1]+_digit[top]; _digit[--top]=cnt; break; case '-':cnt=_digit[top-1]-_digit[top]; _digit[--top]=cnt; break; case '*':cnt=_digit[top-1]*_digit[top]; _digit[--top]=cnt; break; case '/':cnt=_digit[top-1]/_digit[top];//此题为整除,因题而异 _digit[--top]=cnt; break; case '^':cnt=_pow(_digit[top-1],_digit[top]); _digit[--top]=cnt; break; default:string temp; while(i<len&&isdigit(str[i])) temp+=str[i],i++;i--; _digit[++top]=atoint64(temp); } } return _digit[0]; } int main() { char h[111]; while(gets(h)) { string a,res; a=h;//再赋值 _pre(a);//处理负号 //cout<<a<<endl; _change(a,res); __int64 cnt=_value(res); printf("%I64d/n",cnt); } return 0; } //(((((((((-1)