很早以前就写过双栈的表达式计算.

这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作.

感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子.

这样学习印象才深嘛.

我喜欢逆过来贴代码~

这是运行结果:

aaarticlea/png;base64,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" alt="" />

cal() 是节点类里的计算方法,从根节点调用,递归所有子节点进行计算.Left,Right分别是左右子节点.

      public double cal()
{
if (this.isDig==false)
{
return CAL(Fuhao, Left.cal() , Right.cal() );
}
return value;
}

下面的CAL(大写)的是静态的计算方法,根据不同符号进行不同计算.

  public static double CAL(int FUHAO, double l, double r)
{
switch (FUHAO)
{
case ADD:
return l + r;
case SUB:
return l - r;
case MUL:
return l * r;
case DIV:
return l / r;
}
return ;
}

看到这,是不是觉得很简单呢?

没错,二叉树在计算表达式时非常简单,但难点在于如何构建这个表达式树.

写程序最重要的就是严谨强大的逻辑思维能力.

在写下面的方法时,我经历了很多次debug.大概修改了10次,才完成..可见我的逻辑能力还是很不足.

下面这个方法包含大量逻辑判断,可能不好理解,也许某些判断可以简化优化,而且我默认第一位是数字,也就是不支持第一位是括号的表达式.

     public static BNode CreateTree(List<string> zf)
{
var fh=new List<string>{"+","-","*","/"};
var kh = new List<string> { "(", ")" };
BNode CurN=null;
BNode TempCur = null;
foreach (var a in zf)
{
if (fh.Contains(a))
{//是符号
int tfuhao=fh.IndexOf(a); //偷懒写法,取得符号值,0-3分别代表+-*/
int tfhvalue=tfuhao/; //符号优先值,+-为0.*/为1,判断符号优先,这里写的很偷懒
if (CurN.Parent != null)
{
if (CurN.Parent.FuhaoValue < tfhvalue)
//当前节点的父节点符号<新节点符号,即新加的符号优先级比较高.
{
var tp = CurN.Parent;
var t = CurN;
CurN = new BNode { Parent=tp,Left=t , isDig = false, Fuhao = tfuhao,FuhaoValue=tfhvalue };
tp.Right = CurN;
t.Parent = CurN;
}
else if (CurN.Parent.FuhaoValue >= tfhvalue)
//新加的符号优先级不高于当前节点的父节点符号,
{
BNode tp = CurN;
while (tp.isKuoHao || tp.isDig || tp.FuhaoValue != tfhvalue)
//循环取得与新加节点优先级相同的节点.
{
if (tp.Parent != null)
tp = tp.Parent;
else
break;
}
if (tp.Parent == null)
{
CurN = new BNode { Left = tp, isDig = false, Fuhao = tfuhao, FuhaoValue = tfhvalue };
tp.Parent = CurN;
}
else
{
var p = tp.Parent;
CurN = new BNode { Parent = p, Left = tp, isDig = false, Fuhao = tfuhao, FuhaoValue = tfhvalue };
p.Right = CurN;
tp.Parent = CurN;
}
}
}
else
{
var t = CurN;
CurN = new BNode { isDig = false, Fuhao = tfuhao, FuhaoValue = tfhvalue, Left = CurN };
t.Parent = CurN;
} }
else if (kh.Contains(a))
{//是括号
if (a == "(")
{
TempCur = CurN;
CurN = null;
}
else if (a == ")")
{
var top= CurN.GetTop();
top.Parent = TempCur;
TempCur.Right = top;
CurN = top;
CurN.isKuoHao = true;
}
}
else
{//是数字
if (CurN == null)
CurN = new BNode { value = double.Parse(a) };
else if (CurN.isDig == false)
{
var t= CurN;
CurN = new BNode { value = double.Parse(a), Parent=t };
t.Right = CurN;
}
}
} return CurN;
}

其实写起来也没什么太大难度,只要把所有情况的处理都考虑到就行.

最后是2个辅助函数.

FenGe:我比较偷懒,事先把字符串里的数字和符号分隔开了,这样就不用一位一位的去取判断是数字或者符号.

Cal:使用时唯一需要接触的函数.

    public static double Cal(string expresstion)
{
var a= FenGe(expresstion);
var zfs = a.Split('|' ,StringSplitOptions.RemoveEmptyEntries);
var t= BNode.CreateTree(zfs.ToList());
var root= t.GetTop();
var result = root.cal();
return result;
} public static string FenGe(string exp)
{
var ys = new List<string> { "\\d*\\.?\\d+", "[+\\-\\*/\\(\\)]{1}" };
ys.ForEach(a =>
{
var r = new Regex(a);
exp= r.Replace(exp, b => b.Value + "|", int.MaxValue);
});
return exp;
}
   public BNode GetTop()
{
if (Parent != null)
return Parent.GetTop();
return this;
}

总结:

二叉树计算的优势在于易于扩展,很容易将数字计算扩展成支持函数,参数的表达式计算.

计算时候的逻辑很简单,但是构建二叉树就比较复杂.

基本逻辑:遇到数字,放到左节点,遇到符号(判断是否为根节点,是作为数字的父节点,否的话判断符号优先级,优先级高,就放入低优先级的右节点;优先级低或者等于就

放到前一个符号的父节点.

括号的处理就是:重新创一个节点作为当前节点,当作一个新的表达式进行处理,等遇到右括号的时候,再将括号内的表达式的根节点放入之前最后处理的节点的子节点.

逻辑很多比较复杂,慢慢想应该不难理解.

效率来说:纯数字的计算肯定二栈的方式快.

C# - 二叉树表达式计算的更多相关文章

  1. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  2. C#动态表达式计算

    C#动态表达式计算 应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行 ...

  3. C#动态表达式计算(续2)

    上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...

  4. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  5. C++实现 逆波兰表达式计算问题

    C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...

  6. 算法笔记_044:表达式计算求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ...

  7. Fel表达式计算引擎学习

    转载原文地址:Fel是轻量级的高效的表达式计算引擎 Fel的问题 Fel的问题 Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是 ...

  8. 蓝桥杯 算法训练 ALGO-156 表达式计算

    算法训练 表达式计算   时间限制:1.0s   内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输 ...

  9. YTU 2500: 二元表达式计算

    2500: 二元表达式计算 时间限制: 1 Sec  内存限制: 128 MB 提交: 38  解决: 23 题目描述 根据输入的含有两个二元运算的表达式,编程计算并输出表达式的值.如输入:  2+9 ...

随机推荐

  1. Js使用word书签填充内容

    Js使用word书签填充内容 1.在模板文件中需要填充的地方插入书签 填充内容为:(|光标所在处) 填写书签名,点击添加完成: 2.使用js打开模板,获取书签位置,填充数据: function pri ...

  2. Java中接口与实例化

    一.问题引入         前两天学代理模式的时候想到的,接口可不可以new呢?         接口是特殊的抽象类,接口的方法都默认为  public  abstract  的... 抽象的方法不 ...

  3. unity3d中的http通信

    转载 http://blog.csdn.net/mfc11/article/details/8188785的博客,如果侵权,请留言我及时删除! 前言 Unity3d 是一个跨平台的引擎,在移动互联网浪 ...

  4. Nearest Common Ancestors

    poj1330:http://poj.org/problem?id=1330 题意:求一棵树上的两点的最近的公共祖先. 题解:第一次接触LCA,第一道模板题. #include <iostrea ...

  5. 【号外号外:微软收购 .NET 的开源实现 Xamarin 项目的公司】

    [首页小编:你好,关于博客园对Xamarin的报道确实一笔而过了,希望能不要把这篇文章移除首页呵呵,祝福帅气,聪明,敏捷,睿智的小编] 一个月后,微软开始免费Xamarin了....还要放开SDK.. ...

  6. Win7下IE8无法打开https类型的网站解决方法笔记

      现象: 一台笔记本(XP系统),一台台式机(Win7,64位系统),都是IE8,之前没任何问题,访问https也没异常,都能正常访问; 前天突然发现登录火车票网站出现无法打开登录页面情况,后来换其 ...

  7. JavaScript & HTML5 Canvas 概览 更新时间2014-0411-1805

    HTML Canvas 坐标体系:矩形区域的左上角为坐标原点(0,0),向右为x轴,向下为y轴. 检测浏览器是否支持Canvas(IE系列从IE9开始支持): <!DOCTYPE html> ...

  8. Http报文 状态码

    一.HTTP报文 1.HTTP报文介绍 HTTP报文:用于HTTP协议交互的信息. HTTP报文由报文头部和报文主体(非必须)构成,中间由空行来分隔. 1.1 请求报文:客户端发起的报文. 1).报文 ...

  9. 【GDI+编程】--从三问开始

    一. GDI+三问 1.1 GDI+是什么? GDI+是GDI(Graphics Device Interface)的后继者,是一种图形设备的接口,它构成了Win XP操作系统的子系统的API. 1. ...

  10. readmine项目管理和缺陷跟踪工具

    官方网站:http://www.redmine.org/演示地址:http://demo.redmine.org/下载地址:http://www.redmine.org/projects/redmin ...