带括号的式子求值 五种运算符
2018-03-14 22:17
225 查看
建议先看之前的去括号部分,链接有。
点击打开链接
#include<iostream> #include<cstring> #include<string> using namespace std; int poww(int a,int b)//快速幂; {int ans=1,base=a; while(b!=0) {if(b&1!=0) ans*=base; base*=base; b>>=1; } return ans; } int read(string s) {int t=s.length(); int k=0; for(int i=0;i<=t-1;i++) k*=10,k+=(s[i]-48); return k; } int su(string s,int j)//跳括号; {int t=1; while(t){ j--; if(s[j]==')') t++; if(s[j]=='(') t--; } return j; } int find(string s) {int i,k=0;bool pd=false; i=s.length()-1; while(i>=0){ if(s[i]=='^') return i; if(s[i]=='+' || s[i]=='-') k=i,pd=true; if((s[i]=='*' || s[i]=='/') && !pd) k=i; if(s[i]==')') i=su(s,i); i--;} return k; } int redu(string s) { int left,right; char p; int i; if(s[s.length()-1]==')' && su(s,s.length()-1)==0) {s=s.substr(1,s.length()-2); return redu(s); } i=find(s);p=s[i]; if(i==0) return read(s);//读数; left=redu(s.substr(0,i)); right=redu(s.substr(i+1,s.length()-i-1));//二分; if(p=='*') return left*right; if(p=='+') return left+right; if(p=='/') return left/right; if(p=='-') return left-right; if(p=='^') return poww(left,right);//判断,计算; } int main() {string s; char p; cin>>s; cout<<redu(s); return 0; }十分简单,跟前去括号思路差不多,也是二分找出最终运算符。
相关文章推荐
- c/c++表达式求值,即包含加减乘除以及括号的式子(栈)
- 使用传统算法进行表达式求值(数字支持科学表示法,操作符支持加减乘除乘方, 支持括号, 不支持函数)
- &&、||、?:、,四个运算符的求值顺序
- linux shell (()) 双括号运算符使用
- 快速理解关于括号运算符、static_cast、dynamic_cast和reinterpret_cast
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序
- 参数求值顺序对增量运算符的影响
- 浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序
- 第十三天 简洁运算符-括号优先级
- java中 & | && || ^ 五种运算符的区别
- 规则 2.9:过长的表达式应在低优先级操作符处换行书写,操作符放在新行之首,划出的新行要左对齐,不同运算符混合使用时要加以括号标识优先级。
- linux shell “(())” 双括号运算符使用
- 书写优雅的shell脚本(五)- shell中(())双括号运算符
- linux shell (()) 双括号运算符使用
- linux shell “(())” 双括号运算符使用
- C语言精华记录——贰(几个关键字、几个运算符、隐式转换/溢出、表达式求值的顺序、左值和右值)
- 表达式字符串求值,这里表达式中只有四种运算符”+,-*\”。例如,3+6*2;
- 书写优雅的shell脚本(五)- shell中(())双括号运算符
- 模拟计算器:一个带加减乘除和括号的表达式 求值
- 五种运算符