社区
C#
帖子详情
如何解析数据库中的数学表达式
clmilan
2006-06-26 08:46:08
现在数据库中有一列存的是数学表达式,我现在要把他读出来之后,进行解析,表达式中的变量信息存在另一个表里.
以前没做过这类东西,希望高手能给点帮助或是给个方向.谢谢!
...全文
130
2
打赏
收藏
如何解析数据库中的数学表达式
现在数据库中有一列存的是数学表达式,我现在要把他读出来之后,进行解析,表达式中的变量信息存在另一个表里. 以前没做过这类东西,希望高手能给点帮助或是给个方向.谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zzzzzz7
2006-06-26
打赏
举报
回复
直接调用 SimpleRPN.ComputeRPN()
参数为算术表达式字符串
zzzzzz7
2006-06-26
打赏
举报
回复
using System;
namespace myMath
{
/// <summary>
/// SimpleRPN 的摘要说明。
/// </summary>
public sealed class SimpleRPN
{
private SimpleRPN(){}
/// <summary>
/// Reverse Polish Notation
/// 算术逆波兰表达式.生成.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private static string BuildingRPN(string s)
{
System.Text.StringBuilder sb=new System.Text.StringBuilder(s);
System.Collections.Stack sk=new System.Collections.Stack();
System.Text.StringBuilder re=new System.Text.StringBuilder();
char c=' ';
//sb.Replace(" ","");
for(int i=0;i<sb.Length;i++)
{
c=sb[i];
if(char.IsDigit(c))//数字当然要了.
re.Append(c);
//if(char.IsWhiteSpace(c)||char.IsLetter(c))//如果是空白,那么不要.现在字母也不要.
//continue;
switch(c)//如果是其它字符...列出的要,没有列出的不要.
{
case '+':
case '-':
case '*':
case '/':
case '%':
case '^':
case '!':
case '(':
case ')':
case '.':
re.Append(c);
break;
default:
continue;
}
}
sb=new System.Text.StringBuilder(re.ToString());
#region 对负号进行预转义处理.
for(int i=0;i<sb.Length-1;i++)
if(sb[i]=='-'&&(i==0||(sb[i-1]=='('||Power(sb[i-1])>0)))
sb[i]='!';//字符转义.
#endregion
#region 将中缀表达式变为后缀表达式.
re=new System.Text.StringBuilder();
for(int i=0;i<sb.Length;i++)
{
if(char.IsDigit(sb[i])||sb[i]=='.')//如果是数值.
{
re.Append(sb[i]);//加入后缀式
}
else if(sb[i]=='+'
||sb[i]=='-'
||sb[i]=='*'
||sb[i]=='/'
||sb[i]=='%'
||sb[i]=='^'
||sb[i]=='!')//.
{
#region 运算符处理
while (sk.Count>0) //栈不为空时
{
c = (char)sk.Pop(); //将栈中的操作符弹出.
if (c == '(') //如果发现左括号.停.
{
sk.Push(c); //将弹出的左括号压回.因为还有右括号要和它匹配.
break; //中断.
}
else
{
if(Power(c)<Power(sb[i]))//如果优先级比上次的高,则压栈.
{
sk.Push(c);
break;
}
else
{
re.Append(' ');
re.Append(c);
}
//如果不是左括号,那么将操作符加入后缀式中.
}
}
sk.Push(sb[i]); //把新操作符入栈.
re.Append(' ');
#endregion
}
else if(sb[i]=='(')//基本优先级提升
{
sk.Push('(');
re.Append(' ');
}
else if(sb[i]==')')//基本优先级下调
{
while (sk.Count>0) //栈不为空时
{
c = (char)sk.Pop(); //pop Operator
if (c != '(')
{
re.Append(' ');
re.Append(c);
re.Append(' ');
}
else
break;
}
}
else
re.Append(sb[i]);
}
while(sk.Count>0)
{
re.Append(' ');
re.Append(sk.Pop());
}
#endregion
re.Append(' ');
return FormatSpace(re.ToString());
}
/// <summary>
/// 算术逆波兰表达式计算.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ComputeRPN(string s)
{
string S=BuildingRPN(s);
string tmp="";
System.Collections.Stack sk=new System.Collections.Stack();
char c=' ';
System.Text.StringBuilder Operand=new System.Text.StringBuilder();
double x,y;
for(int i=0;i<S.Length;i++)
{
c=S[i];
if(char.IsDigit(c)||c=='.')
{//数据值收集.
Operand.Append(c);
}
else if(c==' '&&Operand.Length>0)
{
#region 运算数转换
try
{
tmp=Operand.ToString();
if(tmp.StartsWith("-"))
{
sk.Push(-((double)Convert.ToDouble(tmp.Substring(1,tmp.Length-1))));
}
else
{
sk.Push(Convert.ToDouble(tmp));
}
}
catch
{
return "发现异常数据值.";
}
Operand=new System.Text.StringBuilder();
#endregion
}
else if(c=='+'//运算符处理.双目运算处理.
||c=='-'
||c=='*'
||c=='/'
||c=='%'
||c=='^')
{
#region 双目运算
if(sk.Count>0)/**************************/
{
y=(double)sk.Pop();
}
else
{
sk.Push(0);
break;
}
if(sk.Count>0)
x=(double)sk.Pop();
else
{
sk.Push(y);
break;
}
switch(c)
{
case '+':
sk.Push(x+y);
break;
case '-':
sk.Push(x-y);
break;
case '*':
sk.Push(x*y);
break;
case '/':
sk.Push(x/y);
break;
case '%':
sk.Push(x%y);
break;
case '^':
sk.Push(System.Math.Pow(x,y));
break;
}
#endregion
}
else if(c=='!')//单目取反.)
{
sk.Push(-((double)sk.Pop()));
}
}
if(sk.Count>1)
return "运算没有完成.";
if(sk.Count==0)
return "结果丢失..";
return sk.Pop().ToString();
}
/// <summary>
/// 优先级别测试函数.
/// </summary>
/// <param name="opr"></param>
/// <returns></returns>
private static int Power(char opr)
{
switch(opr)
{
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '%':
case '^':
return 3;
case '!':
return 4;
default:
return 0;
}
}
/// <summary>
/// 规范化逆波兰表达式.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private static string FormatSpace(string s)
{
System.Text.StringBuilder ret=new System.Text.StringBuilder();
for(int i=0;i<s.Length;i++)
{
if(!(s.Length>i+1&&s[i]==' '&&s[i+1]==' '))
ret.Append(s[i]);
else
ret.Append(s[i]);
}
return ret.ToString();//.Replace('!','-');
}
}
/*
(6+9-8+5-8)*(2+5+8)/7+5
(1+2+3+4+5+6+7+8+9)*(1+2+3+4+5+6+7+8+9)/(9+8+7+6)*3-2-2+5/7-3
(-3+4+9)*(-3)*7/(-5*2)
-(6+9-8+5-8)*(2+5+8)
5^-3
1+2+3+4+5+6+7+8+9
1*2*3*4*5*6*7*8*9
1-2-3-4-5-6-7-8-9
1/2/3/4/5/6/7/8/9
(6+9-8+5-8)*(2+5+8)
*/
}
java笔试题五十-kformula:用Kotlin编写的
数学
表达式
引擎,运行在JVM上
KFormula,您可以
解析
简单的
数学
表达式
文本并获得计算结果。 您可以添加变量/常量,或者除此之外,您可以定义自己的函数并将逻辑公开给引擎。 通过这种方式,您可以使您的应用程序能够接受来自用户输入甚至来自...
Arithmetic-Expression-Interpreter:实现了递归下降
解析
器,以将
数学
表达式
转换为树表示形式(
中
缀,前缀和后缀)。 使用访问者模式来评估
表达式
的值
•开发了递归下降
解析
器,将
数学
表达式
转换为树表示形式(
中
缀,前缀和后缀) •编码逻辑以遍历树的
中
缀表示并使用堆栈评估
表达式
•实现了访问者模式,以将树转换为前缀/后缀
中
的链表,并评估了
表达式
的值
PHP bible(PHP圣经)
中
文版
数学
运算函数库 mcrypt 编码函数库 mhash 哈稀函数库 杂项函数库 mSQL
数据库
函数库 SQL Server
数据库
函数库 MySQL
数据库
函数库 Sybase
数据库
函数库 网络函数库 NIS 函数库 ODBC
数据库
链接函数库 ...
Java
解析
字符串计算
表达式
当业务需求需要由业务部门录入计算
表达式
时,存储在
数据库
是一个字符串,例如:(PV-AV)/PV>0.5 此时则需要用到javax.script.ScriptEngine的eval方法来实现。 代码实现 public static void main(String[] args) ...
①
数据库
介绍 及 关系型
数据库
的关系代数
表达式
数据库
基础
数据库
介绍数据模型概念模型逻辑模型关系型
数据库
写下博客用于自我复习、自我总结。 如有错误之处,请各位指出。 本
数据库
系列专栏,文章的重心将会是总结SQL语句的使用,而不会涉及到太多
数据库
本身或...
C#
110,552
社区成员
642,562
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章