在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~

在这里为大家封装了一个C#版本的eval函数,具体的设计参考了《大话数据结构》

1. 中缀表达式

中缀表达式即我们平时使用的四则运算表达式,如:9+(3-1)*3+10/2,但是程序却很难识别这样的表达式,所以需要把它转化成后缀表达式

2. 后缀表达式

因为所有的运算符都在数字后面,所以称其为后缀表达式,如:9 3 1 – 3 * + 10 2 / +,那么程序如何识别后缀表达式呢,这里就用到了栈(Stack),主要分以下步骤:

1) 将字符从前往后进行入栈操作

2)如果字符为数字则直接入栈,如:上例中的9、3、1都直接入栈

3)如果为运算符则获取栈顶的两个数字,即执行两次pop操作,如:在执行到上例中的“-”时,将3、1出栈,然后运行3-1

4)将上一步运算的结果入栈,即将3-1=2入栈

5) 根据以上原则,运行的顺序如下:3-1=2,2*3=6,9+6=15,10/2=5,15+5=20,20就是我们想要的结果

3. 中缀表达式转后缀表达式

这里还是得用到栈(Stack),我们还是用 9+(3-1)*3+10/2 来做例子,原则如下:

  1)将字符从前往后进行入栈操作

  2)当字符为数字时直接输出,如:上例中9直接输出

  3)当字符为运算符时,如果是空栈则直接入栈,如下图步骤1

  4)如果是“(”则直接入栈,如步骤2

  5) 如果是“)”则循环取出栈内元素,直到“(”出栈,再将“()”内的运算符输出,如步骤4

  6)如果是“*”或“/”则直接入栈,如步骤5

  7)如果是“+”或“-”,且栈顶的运算符为“*”或“/”,则取出所有栈内元素输出,然后将本次操作符入栈,如步骤6

  8)表达式遍历完成后,循环取出栈内元素进行输出,我们最后得到的结果就是 9 3 1 – 3 * + 10 2 / +

4.实现源码如下:

  

     public class Calculator
{
public Calculator()
{
_OptStack = new Stack<char>();
_SuffixStack = new Stack<float>();
} private Stack<char> _OptStack;
private Stack<float> _SuffixStack; public float Calculate(string expression)
{
string lastNum = string.Empty;
for (int i = ; i < expression.Length; i++)
{
if (char.IsNumber(expression[i]) || expression[i].Equals('.'))
{
lastNum += expression[i];
}
else
{
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
lastNum = string.Empty;
}
AddOpt(expression[i]);
}
}
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
}
while (_OptStack.Count > )
{
Merger(_OptStack.Pop());
} return _SuffixStack.Pop();
} private void AddOpt(char opt)
{
if (_OptStack.Count == )
{
_OptStack.Push(opt);
return;
}
if (opt.Equals(')'))
{
while (!_OptStack.Peek().Equals('('))
{
Merger(_OptStack.Pop());
}
_OptStack.Pop();
return;
}
char tempOpt = _OptStack.Peek();
if ((opt.Equals('-') || opt.Equals('+')) &&
(tempOpt.Equals('*') || tempOpt.Equals('/')))
{
while (_OptStack.Count > )
{
Merger(_OptStack.Pop());
}
} _OptStack.Push(opt);
} private void Merger(float exp)
{
_SuffixStack.Push(exp);
} private void Merger(char exp)
{
float num1 = _SuffixStack.Pop();
float num2 = _SuffixStack.Pop();
float result = ;
switch (exp)
{
case '+':
result = num2 + num1;
break;
case '-':
result = num2 - num1;
break;
case '*':
result = num2 * num1;
break;
case '/':
result = num2 / num1;
break;
}
_SuffixStack.Push(result);
}
}

5. 下载

Demo.rar

C#实现eval 进行四则运算(有码)的更多相关文章

  1. C#实现eval 进行四则运算

    昨天在园子里看到有园友,写了相同标题的一篇文章.重点讲的是中缀表达式转换为后缀表达式的算法,但是实现的四则运算 有bug.其实我没看之前也不懂什么是 中缀和后缀表达式,之前有用过js eval 内置函 ...

  2. C#实现eval

    C#实现eval 进行四则运算(有码)   在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~ 在这里为大家封装了一个C#版 ...

  3. 软件工程(FZU2015)增补作业

    说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/01/03 前11次正式作业和练习的迭代评分见:http://www.cnbl ...

  4. 【转】Perl Unicode全攻略

    Perl Unicode全攻略 耐心看完本文,相信你今后在unicode处理上不会再有什么问题. 本文内容适用于perl 5.8及其以上版本. perl internal form 在Perl看来, ...

  5. 解决JSON.stringify()自动将中文转译成unicode的方法

    最近在工作中,发现在IE8下JSON.stringify()自动将中文转译为unicode编码,原本选择的中文字符,传到后台变为了unicode编码,即\u****的形式.查找资料后发现,与标准的JS ...

  6. Webpack 4教程 - 第六部分 增强开发时体验

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/08/06/webpack-4-course-part ...

  7. buildroot使用介绍

    buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfig配置文件构成的.你可以和编译Linux内核一样,通过buildro ...

  8. 软件工程(FZU2015) 增补作业

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/ ...

  9. Perl Unicode全攻略

    Perl Unicode全攻略 耐心看完本文,相信你今后在unicode处理上不会再有什么问题. 本文内容适用于perl 5.8及其以上版本. perl internal form 在Perl看来, ...

随机推荐

  1. Android 桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    首先是一个小的悬浮窗显示的是当前使用了百分之多少的内存,点击一下小悬浮窗,就会弹出一个大的悬浮窗,可以一键加速.好,我们现在就来模拟实现一下类似的效果. 先谈一下基本的实现原理,这种桌面悬浮窗的效果很 ...

  2. Mybatis介绍(一)

    这里介绍的mybatis比较简单, 我做为一个初学者, 记录下个人在学习中方法, 如果那里出错, 希望读者朋友们见谅. 首先这里介绍一下我们下面用的表结构: author表是保存了作者的个人信息, 因 ...

  3. C#基础知识图谱

  4. 用TextKit实现表情混排

      Textkit是iOS7新推出的类库,其实是在之前推出的CoreText上的封装,有了这个TextKit,以后不用再拿着CoreText来做累活了,根据苹果的说法,他们开发了两年多才完成,而且他们 ...

  5. UVA Live Archive 4015 Cave (树形dp,分组背包)

    和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ...

  6. 【BZOJ1030】[JSOI2007] 文本生成器(AC自动机上跑DP)

    点此看题面 大致题意: 给你\(N\)个字符串(只含大写字母),要你求出有多少个由\(M\)个大写字母构成的字符串含有这\(N\)个字符串中的至少一个. \(AC\)自动机 看到题目,应该比较容易想到 ...

  7. 版本管理工具-SourceSafe

    一.什么是SourceSafe SourceSafe是Micrsoft公司推出的一款支持团队协同开发的配置管理工具,是Visual Studio的套件之一.因为其短小精悍,又继承了微软集成销售的一贯作 ...

  8. web项目小总结

     初步小结 1.之前的CSS有些遗忘,返回去重新看知识点,频繁会浪费项目时间. 比如说: position定位 1 position: absolute;//绝对定位 2 position:relat ...

  9. jfinal excel表导出

    在自己的WEB项目中要用到导出Excel,所以结合网络上的资源写了一个自己的export 工具类. 说明: JFinal 环境 WEB项目 JAVA后台生成非JS插件 好了,直接撸代码 1.设置文件保 ...

  10. Oracle10g安装过程中的Configuration Assistant配置失败的问题。

    前几天安装Oracle的时候碰到了一个小问题,是在最后配置的时候,出现失败提示如下 失败提示:一些 Configuration Assistant 失败.强烈建议您此时重试这些 Configurati ...