C#实现eval

时间:2022-09-24 19:31:35

C#实现eval 进行四则运算(有码)

 

在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 / +

C#实现eval

4.实现源码如下:

  

C#实现eval
 1     public class Calculator
2 {
3 public Calculator()
4 {
5 _OptStack = new Stack<char>();
6 _SuffixStack = new Stack<float>();
7 }
8
9 private Stack<char> _OptStack;
10 private Stack<float> _SuffixStack;
11
12 public float Calculate(string expression)
13 {
14 string lastNum = string.Empty;
15 for (int i = 0; i < expression.Length; i++)
16 {
17 if (char.IsNumber(expression[i]) || expression[i].Equals('.'))
18 {
19 lastNum += expression[i];
20 }
21 else
22 {
23 if (lastNum != string.Empty)
24 {
25 Merger(float.Parse(lastNum));
26 lastNum = string.Empty;
27 }
28 AddOpt(expression[i]);
29 }
30 }
31 if (lastNum != string.Empty)
32 {
33 Merger(float.Parse(lastNum));
34 }
35 while (_OptStack.Count > 0)
36 {
37 Merger(_OptStack.Pop());
38 }
39
40 return _SuffixStack.Pop();
41 }
42
43 private void AddOpt(char opt)
44 {
45 if (_OptStack.Count == 0)
46 {
47 _OptStack.Push(opt);
48 return;
49 }
50 if (opt.Equals(')'))
51 {
52 while (!_OptStack.Peek().Equals('('))
53 {
54 Merger(_OptStack.Pop());
55 }
56 _OptStack.Pop();
57 return;
58 }
59 char tempOpt = _OptStack.Peek();
60 if ((opt.Equals('-') || opt.Equals('+')) &&
61 (tempOpt.Equals('*') || tempOpt.Equals('/')))
62 {
63 while (_OptStack.Count > 0)
64 {
65 Merger(_OptStack.Pop());
66 }
67 }
68
69 _OptStack.Push(opt);
70 }
71
72 private void Merger(float exp)
73 {
74 _SuffixStack.Push(exp);
75 }
76
77 private void Merger(char exp)
78 {
79 float num1 = _SuffixStack.Pop();
80 float num2 = _SuffixStack.Pop();
81 float result = 0;
82 switch (exp)
83 {
84 case '+':
85 result = num2 + num1;
86 break;
87 case '-':
88 result = num2 - num1;
89 break;
90 case '*':
91 result = num2 * num1;
92 break;
93 case '/':
94 result = num2 / num1;
95 break;
96 }
97 _SuffixStack.Push(result);
98 }
99 }
C#实现eval

5. 下载

C#实现eval

Demo.rar

C#实现eval的更多相关文章

  1. JSON&period;parse 与 eval&lpar;&rpar; 对于解析json的问题

    1.eval()与JSOn.parse的不同 eval() var c = 1; //全局变量 var jsonstr1 = '{"name":"a",&quo ...

  2. JSON&period;parse与eval的区别

    JSON.parse与eval和能将一个字符串解析成一个JSON对象,但还是有挺大区别. 测试代码 var A = "{ a: 1 , b : 'hello' }"; var B ...

  3. JS eval&lpar;&rpar;函数的一些见解

    一.eval是基本使用规则 1 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 2 eval(string) 3 string必需.要计算的字符串,其中含有要计算的 ...

  4. Javascript动态执行JS(new Function与eval比较)

    new Function与eval可以动态执行JS,只要把拼接好的JS方法,然后以字符串的形式传入到这两个函数,可以执行,其中new Function用在模板引擎比较多. 用 Function 类直接 ...

  5. Python&colon;eval的妙用和滥用

    时间 2014-07-08 13:05:24 CSDN博客 原文  http://blog.csdn.net/zhanh1218/article/details/37562167 主题 Python ...

  6. JSON中eval与parse的区别

    json的的解析方法 (非原创) json的解析方法共有两种:eval_r() 和 JSON.parse(),使用方法如下: var jsonData = '{"data1":&q ...

  7. eval解析JSON中的注意点

       在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery ...

  8. jQuery Ajax请求(关于火狐下SyntaxError&colon; missing &rsqb; after element list ajax返回json,var json &equals; eval&lpar;&quot&semi;&lpar;&quot&semi;&plus;data&plus;&quot&semi;&rpar;&quot&semi;&rpar;&semi; 报错)

    $.ajax({    contentType: "application/x-www-form-urlencoded;charset=UTF-8" ,    type: &quo ...

  9. 被嫌弃的eval和with

    × 目录 [1]eval [2]with 前面的话 eval和with经常被嫌弃,好像它们的存在就是错误.在CSS中,表格被嫌弃,在网页中只是用表格来展示数据,而不是做布局,都可能被斥为不规范,矫枉过 ...

  10. Global eval&period; What are the options&quest;

    David Flanagan最近写了一个关于全局eval的简单表达式,可以用一行式子表示: var geval = this.execScript || eval; 尽管看起来很简短,但是跨浏览器的兼 ...

随机推荐

  1. 清理SYSAUX表空间

    1.查看SYSAUX表空间中数据分布情况 col SEGMENT_NAME for a30 set lines 999 select * from (select segment_name,PARTI ...

  2. PushSharp的使用

    PushSharp的使用 最近做公司的一个项目.一旦数据库插入新的消息,就要通知服务器,将这些新的消息推送给苹果客户端,以前我们的项目中有人做过这个功能,无奈做的有点复杂,而且代码没注释,我压根就没看 ...

  3. 【Machine Learning in Action --5】逻辑回归(LogisticRegression)从疝气病预测病马的死亡率

    背景:使用Logistic回归来预测患有疝气病的马的存活问题,这里的数据包括368个样本和28个特征,疝气病是描述马胃肠痛的术语,然而,这种病并不一定源自马的胃肠问题,其他问题也可能引发疝气病,该数据 ...

  4. 面试:Handler 的工作原理是怎样的?

    面试场景 平时开发用到其他线程吗?都是如何处理的? 基本都用 RxJava 的线程调度切换,嗯对,就是那个 observeOn 和 subscribeOn 可以直接处理,比如网络操作,RxJava 提 ...

  5. MySQL入门,了解下、

    本人菜鸡一个,一份简单MySQL笔记送给大家,希望大家喜欢.(●'◡'●) Ⅰ. 数据备份与导入导出 1.1.备份基本概念介绍 1.2.mysqldump详解 1.3.mydumper浅析 1.4.M ...

  6. java30

    1.类的组合关系 当一个类中的字段是一个类时,就称类依赖于字段这个类,也称这两个类为组合关系 2.快捷键:ctrl+shift+c,多行的// ctrl+shift+/,多行的/-----/ 3.类的 ...

  7. 2016 多校联赛7 Balls and Boxes(概率期望)

    Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...

  8. 设计师别浪费时间啦,快来试试这款Sketch标注插件吧

    随着移动互联网的快速发展,用户的需求也在不断地增大,这对产品经理还有设计师的考验是越来越大.市场环境的变化让我们深信为快不破,但是一个产品的产出需要各个环节的紧密配合,但往往在产品输出过程中,由于分工 ...

  9. 提升HTML5的性能体验系列之一 避免切页白屏

    窗体切换白屏的现实问题 HTML5的性能比原生差很多,比如切页时白屏.列表滚动不流畅.下拉刷新和上拉翻页卡顿.在低端Android手机上,很多原生App常用的功能和体验效果都很难使用HTML5技术模拟 ...

  10. 系统安装SQL Sever2000后1433端口未开放,如何打开1433端口的解决方法

    这篇文章主要针对Win2003系统安装SQL Sever2000后1433端口未开放,如何打开1433端口的解决方法. 用了几年的Windows2003和SQL Server2000了,不过这个问题倒 ...