分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
原文地址:
http://www.cnblogs.com/lxfqlcz/archive/2011/08/02/2124854.html
从5月中旬到7月中旬,我一直在做焊接工程中接头图的参数化和自动化生成软件。主要是将各种标准接头图分解为一个个的图元,并自定义图元参数和图参数,用户在使用时,只需修改相关参数值,即能生成其所需要的接头图,无须再人工用CAD软件手动绘画。如下图所示。
最终公式将解析成 x=2.0 * 3 / 1.5, 最终结果为 4.0。问题的焦点在于如何将“2.0 * 3 / 1.5”这种字符串的表达式,让计算机能理解,并计算出结果。这里我采用了“逆波兰式算法”来解决这个问题。
关于“逆波兰式算法”的具体内容,请看这里 http://baike.baidu.com/view/2582.htm ,里面解释得很好。
最终程序里面的算法描述如下 :
逆波兰式算法
2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈
3、若读取的是运算符
(1) 该运算符为左括号"(",则直接存入运算符堆栈。
(2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止,此时抛弃该左括号。
(3) 该运算符为非括号运算符:
(a) 若运算符堆栈栈顶的运算符为左括号,则直接存入运算符堆栈。
(b) 若比运算符堆栈栈顶的运算符优先级高,则直接存入运算符堆栈。
(c) 若比运算符堆栈栈顶的运算符优先级低或相等,则输出栈顶运算符到操作数堆栈,直至运算符栈栈顶运算符低于(不包括等于)该运算符优先级,或为左括号,
并将当前运算符压入运算符堆栈。
4、当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。
下面我们来具体实现下这个算法,代码中注释较全,就不详细解说了。
首先,我们来定义下操作数类。


2 /// 操作数类型
3 /// </summary>
4 public enum OperandType
5 {
6 /// <summary>
7 /// 函数
8 /// </summary>
9 FUNC = 1 ,
10
11 /// <summary>
12 /// 日期
13 /// </summary>
14 DATE = 2 ,
15
16 /// <summary>
17 /// 数字
18 /// </summary>
19 NUMBER = 3 ,
20
21 /// <summary>
22 /// 布尔
23 /// </summary>
24 BOOLEAN = 4 ,
25
26 /// <summary>
27 /// 字符串
28 /// </summary>
29 STRING = 5
30
31 }


2 {
3 #region Constructed Function
4 public Operand(OperandType type, object value)
5 {
6 this .Type = type;
7 this .Value&nb