using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Exame { //表达式节点, //其中Exp可以表示为对其他节点的引用,格式为['NodeName']的形式,比如['a']+['b']表示 Name=="a"的节点的值 “加上” Name="b"的节点的值 public struct ExpNode { public string Name; //名称 public string Exp; //表达式:可以为直接量:比如:12,30.0.也可能为表达式:['a']+['b']. public ExpNode(string name, string exp) { this.Name = name; this.Exp = exp; } public override string ToString() { return Name; } }
class Program { static void Main(string[] args) { ExpNode[] nodes = new ExpNode[] { new ExpNode("a","['b']+['c']"), new ExpNode("b","['e']-['c']"), new ExpNode("c","['e']+['d']"), new ExpNode("d","10"), new ExpNode("e","['d']+2") }; /*在这里写出排序算法,对Nodes(按照计算的先后顺序)进行排序,得出计算的先后顺序。并且通过Console输出: 正确的结果是: d e c b a * * 假定:表达式不会循环引用。 */ foreach (ExpNode n in nodes) Console.Write(n); } }
string Precede(string p, string q){ switch(p){ case "+": case "-":return ("*/(".IndexOf(q)!=-1)?"<":">"; case "*": case "/":return (q=="(")?"<":">"; case "(":return (q==")")?"=":"<"; case ")":return (q=="(")?"?":">"; case "#":return (q=="#")?"=":"<"; } return "?"; } Double Operate(Double a,char o,Double b) { switch(o) { case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; } return 0; }Object qswhEval1(string Expression){ /*************(qiushuiwuhen 2002-12-14)****************/ Stack nArr=new Stack(),oArr=new Stack(); int j=0; Double a=0,b=0; string w=""; char o; MatchCollection arr=Regex.Matches(Expression.Replace(" ","")+"#",@"(((?<=(^|\())-)?\d+(\.\d+)?|\D)");oArr.Push('#'); w=Convert.ToString(arr[j++]); while(!(w=="#"&&Convert.ToString(oArr.Peek())=="#")){ if("+-*/()#".IndexOf(w)!=-1){ switch(Precede(oArr.Peek().ToString(),w)){ case "<": oArr.Push(w); w=Convert.ToString(arr[j++]); break; case "=": oArr.Pop(); w=Convert.ToString(arr[j++]); break; case ">": o=Convert.ToChar(oArr.Pop()); b=Convert.ToDouble(nArr.Pop()); a=Convert.ToDouble(nArr.Pop()); nArr.Push(Operate(a,o,b)); break; default: return "Error"; break;} }else{ nArr.Push(w); w=Convert.ToString(arr[j++]); } } return nArr.Pop(); }
如果你要结果 可以使用table DataTable _ComputeTable = new DataTable();object _Value = _ComputeTable.Compute("3+222", null);MessageBox.Show(_Value.ToString());
{
string className = "Calc";
string methodName = "Run";
expression = expression.Replace("/", "*1.0/"); //创建编译器实例。
ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler()); //CodeDomProvider complier = CodeDomProvider.CreateProvider(System.Threading.Thread.CurrentThread.CurrentCulture.Name); //设置编译参数。
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true; //创建动态代码。
StringBuilder classSource = new StringBuilder();
classSource.Append("public class " + className + "\n");
classSource.Append("{\n");
classSource.Append(" public object " + methodName + "()\n");
classSource.Append(" {\n");
classSource.Append(" return " + expression + ";\n");
classSource.Append(" }\n");
classSource.Append("}"); //System.Diagnostics.Debug.WriteLine(classSource.ToString()); //编译代码。
CompilerResults result = complier.CompileAssemblyFromSource(paras, classSource.ToString()); //获取编译后的程序集。
Assembly assembly = result.CompiledAssembly; //动态调用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect(); return reobj;
}传入表达式就可以计算了。
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Exame
{
//表达式节点,
//其中Exp可以表示为对其他节点的引用,格式为['NodeName']的形式,比如['a']+['b']表示 Name=="a"的节点的值 “加上” Name="b"的节点的值
public struct ExpNode
{
public string Name; //名称
public string Exp; //表达式:可以为直接量:比如:12,30.0.也可能为表达式:['a']+['b'].
public ExpNode(string name, string exp)
{
this.Name = name;
this.Exp = exp;
}
public override string ToString()
{
return Name;
}
}
class Program
{
static void Main(string[] args)
{
ExpNode[] nodes = new ExpNode[]
{
new ExpNode("a","['b']+['c']"),
new ExpNode("b","['e']-['c']"),
new ExpNode("c","['e']+['d']"),
new ExpNode("d","10"),
new ExpNode("e","['d']+2")
}; /*在这里写出排序算法,对Nodes(按照计算的先后顺序)进行排序,得出计算的先后顺序。并且通过Console输出:
正确的结果是: d e c b a *
* 假定:表达式不会循环引用。
*/
foreach (ExpNode n in nodes)
Console.Write(n);
}
}
string Precede(string p, string q){
switch(p){
case "+":
case "-":return ("*/(".IndexOf(q)!=-1)?"<":">";
case "*":
case "/":return (q=="(")?"<":">";
case "(":return (q==")")?"=":"<";
case ")":return (q=="(")?"?":">";
case "#":return (q=="#")?"=":"<";
}
return "?";
}
Double Operate(Double a,char o,Double b)
{
switch(o)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
return 0;
}Object qswhEval1(string Expression){
/*************(qiushuiwuhen 2002-12-14)****************/
Stack nArr=new Stack(),oArr=new Stack();
int j=0;
Double a=0,b=0;
string w="";
char o;
MatchCollection arr=Regex.Matches(Expression.Replace(" ","")+"#",@"(((?<=(^|\())-)?\d+(\.\d+)?|\D)");oArr.Push('#');
w=Convert.ToString(arr[j++]);
while(!(w=="#"&&Convert.ToString(oArr.Peek())=="#")){
if("+-*/()#".IndexOf(w)!=-1){
switch(Precede(oArr.Peek().ToString(),w)){
case "<":
oArr.Push(w);
w=Convert.ToString(arr[j++]);
break;
case "=":
oArr.Pop();
w=Convert.ToString(arr[j++]);
break;
case ">":
o=Convert.ToChar(oArr.Pop());
b=Convert.ToDouble(nArr.Pop());
a=Convert.ToDouble(nArr.Pop());
nArr.Push(Operate(a,o,b));
break;
default:
return "Error";
break;}
}else{
nArr.Push(w);
w=Convert.ToString(arr[j++]);
}
}
return nArr.Pop();
}
String[] mystr = str.Split('+');
int myint =int.Parse (mystr[0]) + int.Parse (mystr[1]);