[算法] 计算表达式的值
逆方法巴兰 或表达式树会结交新朋友,学习尴尬.
这是你可以阅读理解和应用一个非常简单的方法
简单的表达包括 2 操作 + 和 *
VD: 2*5+3+4*3+2
计算:
如果表达式允许 + 然后在第一个表达 + 表达式最后一节
相反,如果表达式可以允许 * 然后在第一个表达 * 端表达
相反地表达=本身的数量
插图: “2*5+3+4*3+2” = “2*5″+”3+4*3+2” = 2 * 5 + 3 +”4*3+2″= 2 * 5 + 3 +”4*3″+2 = 2*5+3+4*3+2
表达式包括算术 +, -, *
在我们的计算中添加表情符号 + 每个标记前 – (如果标 – 当时离开头)
计算方法为正常私自 –
表达式,包括数学 +, -, *, /
更多 + 前 –
更多 * 前 /
虽然数字改变,如果一个错误字符串去除了第一字符串的 - > 继续改变字符串,然后采取逆. 正常进行计算表达式仅 + 和 *
如果您在文章中使用这种算法,你, 请指定算法qvluom的作者的名字
ZIP与说明 4 操作 +, -, *, /
#include <sstream>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <string>
using namespace std;
int check_to_number(string s) //kiem tra la so
{
int check = 1, l = s.length();
for (int i = 1; i<l; i++)
if (!isdigit(s[i]) && s[i] != '.') //duyt tu phan tu thu 2neu khong la so hoac thi check = 0
{
check = 0;
break;
}
if (s[0] == '-' && check == 1) return 2; //kiem tra dau xau co la -
if (s[0] == '/' && check == 1) return 3; //kiem tra dau xau co la /
if (isdigit(s[0]) && check == 1) return 1; //dau xau la so
}
float convert_to_number(string s)
{
float number, check = check_to_number(s);
if (check > 0)
{
if (check == 1) //neu la so binhf thuong
{
stringstream ss (s);
ss >> number;
}
if (check > 1)
{
stringstream ss (s.substr(1,s.length()-1));
ss >> number;
if (check == 2) number = 0 - number; //neu la phep tru
if (check == 3) number = 1/number; // neu la phep chia
}
return number;
}
}
float process(string s, int l, int r)
{
int li = 0, ri = r;
if (check_to_number(s)) return convert_to_number(s); //{ cout <<" "<<convert_to_number(s)<<endl; return convert_to_number(s);}
else
{
int i;
for (i=li; i<ri; i++) if (s[i] == '+') return process(s.substr(li, i-li), li, i) + process(s.substr(i+1, ri-i), i+1, ri-i);
for (i=li; i<ri; i++) if (s[i] == '*') return process(s.substr(li, i-li), li, i) * process(s.substr(i+1, ri-i), i+1, ri-i);
}
return 0;
}
int main()
{
float number;
string s;
getline(cin,s);
for (int i=0; i<s.length(); i++)
{
if(s[i] == '-') { s.insert(i,"+"); i++; }
if(s[i] == '/') { s.insert(i,"*"); i++; }
}
cout<<s<<endl;
number = process(s,0,s.length());
cout<<number<<endl;
return 0;
}



该算法通过qvluom (Quach范Lượm) 大约建议 2002 并广泛与陌生的名字公布 “Quach阮”. 正确的名称是 “Quach阮”. 这是算法设计简洁,易于理解, 很好地工作参数运算功能. 帕斯卡尔代码说明.
function check(s:string):string; begin while pos('-',s)&gt;0 do s[pos('-',s)]:='$'; while pos('$',s)&gt;0 do begin insert('+',s,pos('$',s)); s[pos('$',s)]:='-'; end; while pos('/',s)&gt;0 do s[pos('/',s)]:='$'; while pos('$',s)&gt;0 do begin insert('*',s,pos('$',s)); s[pos('$',s)]:='/'; end; if s[1]='+' then delete(s,1,1); check:=s; end; function value(s:string):real; var r:real; c:word; begin if pos('+',s)&lt;&gt;0 then value:= value(copy(s,1,pos('+',s)-1))+ value(copy(s,pos('+',s)+1, length(s)-pos('+',s))) else if pos('*',s)&lt;&gt;0 then value:= value(copy(s,1,pos('*',s)-1))* value(copy(s,pos('*',s)+1, length(s)-pos('*',s))) else begin val(s,r,c); if c&lt;&gt;0 then if s[1]='-' then r:=-value(copy(s,2,length(s)-1)) else case upcase(s[c]) of '/': r:=1/value(copy(s,2,length(s)-1)); 'L': r:=ln(value(copy(s,3,length(s)-2))); end; value:=r; end; end; begin write(value(check('1+6/2*3-ln10')):0:3); readln; end.此代码计算功能的值LN; 操作 +, -, *, /. 加入正弦函数, COS, 黄褐色, … 极其简单.
正是这样, 感谢您的评论.
与小问题C代码, 当你输入表达式 (20+9)*(18+2)-1234/5, 结果是 333.2 但你的程序了 246.8, 您查看在您的帮助, 你的部门似乎有他的问题
啊, 谢谢. 这是事实,你的表现将成为含标志你的表情遗憾 ( 和 ). 你的程序不能与表达,使得仅公式计算 4 操作 +, -, *, / 喷气.
你珍惜你的家庭句子24 + 25 + 26 + 27 +…+122+123