表达式求值:一个只有+,-,*,/的表达式,没有括号
一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法
int GetVal(string s){
int A[10000];
int Num=0,Pos=0;
for(int i=0;i<s.size();i++){ //字符串转数字
if(s[i]>='0'&&s[i]<='9'){
Num=Num*10+s[i]-'0';
}
else{
A[Pos]=Num;A[Pos+1]=s[i];
Pos+=2;
Num=0;
}
}
A[Pos]=Num;Pos++;
/*for(int i=0;i<Pos;i++){
if(i%2==0)printf("A[%d]=%d\n",i,A[i]);
else printf("A[%d]='%c'\n",i,A[i]);
}*/
for(int i=0;i<Pos;i++){ //乘除法
if(i%2==1/*operator*/&&A[i]=='*'){
A[i-1]=A[i-1]*A[i+1];
for(int j=i;j<Pos;j++)A[j]=A[j+2];
Pos-=2;
}
if(i%2==1/*operator*/&&A[i]=='/'){
A[i-1]=A[i-1]/A[i+1];
for(int j=i;j<Pos;j++)A[j]=A[j+2];
Pos-=2;
}
}
/*for(int i=0;i<Pos;i++){
if(i%2==0)printf("A[%d]=%d\n",i,A[i]);
else printf("A[%d]='%c'\n",i,A[i]);
}*/
int Ans=A[0];
for(int i=0;i<Pos;i++){ //加减法
if(i%2==1&&A[i]=='-')Ans-=A[i+1];
if(i%2==1&&A[i]=='+')Ans+=A[i+1];
}
return Ans;
}
使用一个数组A[],A[]的0,2,4...(偶数)位存储数字,1,3,5...(奇数)位存储符号。
然后先把符号是乘法,除法的东西计算出来,对奇数位进行操作,然后再移动。
同理,最后计算加减法。
结束。
标签:...,存储,int,算法,求值,除法,表达式 来源: https://www.cnblogs.com/jisuanjizhishizatan/p/15812548.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。