逆波兰表达式解数学运算 感谢作者  http://blog.csdn.net/liuyuxusuixiang/article/details/25289715
public class TCalculator
{
Dictionary<char, int> priorities = null;
const string operators = "+-*/%^";
public TCalculator()
{
priorities = new Dictionary<char, int>();
priorities.Add('#', -);
priorities.Add('+', );
priorities.Add('-', );
priorities.Add('*', );
priorities.Add('/', );
priorities.Add('%', );
priorities.Add('^', );
} double Compute(double leftNum, double rightNum, char op)
{
switch (op)
{
case '+': return leftNum + rightNum;
case '-': return leftNum - rightNum;
case '*': return leftNum * rightNum;
case '/': return leftNum / rightNum;
case '%': return leftNum % rightNum;
case '^': return Math.Pow(leftNum, rightNum);
default: return ;
}
} bool IsOperator(char op)
{
return operators.IndexOf(op) >= ;
} bool IsLeftAssoc(char op)
{
return op == '+' || op == '-' || op == '*' || op == '/' || op == '%';
} Queue<object> PreOrderToPostOrder(string expression)
{
var result = new Queue<object>();
var operatorStack = new Stack<char>();
operatorStack.Push('#');
char top, cur, tempChar;
string tempNum;
if (expression[] == '-') expression = '' + expression; for (int i = , j; i < expression.Length; )
{
cur = expression[i++];
top = operatorStack.Peek(); if (cur == '(')
{
operatorStack.Push(cur);
}
else
{
if (IsOperator(cur))
{
while (IsOperator(top) && ((IsLeftAssoc(cur) && priorities[cur] <= priorities[top])) || (!IsLeftAssoc(cur) && priorities[cur] < priorities[top]))
{
result.Enqueue(operatorStack.Pop());
top = operatorStack.Peek();
}
operatorStack.Push(cur);
}
else if (cur == ')')
{
while (operatorStack.Count > && (tempChar = operatorStack.Pop()) != '(')
{
result.Enqueue(tempChar);
}
}
else
{
tempNum = "" + cur;
j = i;
while (j < expression.Length && (expression[j] == '.' || (expression[j] >= '' && expression[j] <= '')))
{
tempNum += expression[j++];
}
i = j;
result.Enqueue(tempNum);
}
}
}
while (operatorStack.Count > )
{
cur = operatorStack.Pop();
if (cur == '#') continue;
if (operatorStack.Count > )
{
top = operatorStack.Peek();
} result.Enqueue(cur);
} return result;
} public double Calucate(string expression)
{
try
{
var rpn = PreOrderToPostOrder(expression);
var operandStack = new Stack<double>();
double left, right;
object cur;
while (rpn.Count > )
{
cur = rpn.Dequeue();
if (cur is char)
{
right = operandStack.Pop();
left = operandStack.Pop();
operandStack.Push(Compute(left, right, (char)cur));
}
else
{
operandStack.Push(double.Parse(cur.ToString()));
}
}
return operandStack.Pop();
}
catch
{
throw new Exception("表达式格式不正确!");
}
}
class MainClass
{
public static void Main (string[] args)
{ Console.WriteLine((new TCalculator()).Calucate("1+2+3+4").ToString());
Console.WriteLine((new TCalculator()).Calucate("1+1%3+4").ToString());
Console.WriteLine((new TCalculator()).Calucate("1+1-3+4").ToString());
Console.WriteLine((new TCalculator()).Calucate("").ToString());
Console.WriteLine((new TCalculator()).Calucate("2-1+3").ToString());
Console.WriteLine((new TCalculator()).Calucate("2-(1+3)").ToString());
Console.WriteLine((new TCalculator()).Calucate("11-(15+30)").ToString());
Console.ReadKey();
}
}

逆波兰表达式解数学运算(c#)的更多相关文章

  1. CH BR4思考熊(恒等有理式-逆波兰表达式求值)

    恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...

  2. 关于利用STL栈求解四则中缀表达式以及中缀表达式转逆波兰表达式和逆波兰表达式的求解

    今天总结一下栈的一个重要应用---四则数学表达式的求解 数学表达式的求解是栈的一个重要的应用,在计算机的应用中 如果求解一个四则运算表达式,我们可能会直接写一个程序例如什么printf("% ...

  3. [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...

  4. noi1696 逆波兰表达式

    1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...

  5. lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

    题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...

  6. SDIBT2666——逆波兰表达式求值

    逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...

  7. c++实现将表达式转换为逆波兰表达式

    https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...

  8. 逆波兰表达式的C实现

    复习下数据结构,用栈简单实现逆波兰表达式,参考文档: http://www.nowamagic.net/librarys/veda/detail/2307 http://www.nowamagic.n ...

  9. LeetCode_p150_逆波兰表达式计算/后缀表达式计算

    有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...

随机推荐

  1. POJ-3348 Cows 计算几何 求凸包 求多边形面积

    题目链接:https://cn.vjudge.net/problem/POJ-3348 题意 啊模版题啊 求凸包的面积,除50即可 思路 求凸包的面积,除50即可 提交过程 AC 代码 #includ ...

  2. LAMP环境搭建备忘 -- MariaDB 安装(三)

    因为 MySQL 的一些原因,在 Linux 平台上的开源数据库渐渐被 MariaDB 取代. MariaDB 安装命令如下图 安装成功后,接下来就启动这个数据库服务 我们还需要对数据库做一些初始化的 ...

  3. jQuery第一课 加载页面弹出一个对话框

    <script type="text/javascript"> $(document).ready(function(){ alert("欢迎收看:" ...

  4. 查看centos7启动项

    [root@k8s-master ~]# chkconfig Note: This output shows SysV services only and does not include nativ ...

  5. MarkDown写作之嵌入LaTeX和HTML

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49788741 Markdown 是一种 ...

  6. Linux 磁盘坏道检测和修复

    今天在实验室碰到一台机器,根分区和/upgrade分区变成了read-only system.当碰到这个问题的时候,我的第一反应很可能硬件出现了故障,我使用了如下的方法来检测和排除故障: 使用dmes ...

  7. android将String转化为MD5的方法+一些String经常使用的方法

    public class StringUtils { public static String MD5Encode(String origin) { String resultString = nul ...

  8. sage开发url替换字符串

    /// <summary>         /// Url字段值替换,无该字段则加入         /// </summary>         /// <param ...

  9. Numpy科学计算工具

    Numpy初探 Numpy基础数据结构 Numpy数组是一个多维数组,称为ndarray.其由两部分组成: 实际的数据 描述这些数据的原数据 导入该库: import numpy as np 多维数组 ...

  10. BZOJ 3680 模拟退火

    思路: 退火就好了-- 1.强烈建议题目名称改为"吊打出题人" 2.这种题放oj上啥心态...-–hzwer 二分TLE和WA 终于AC了-- //By SiriusRen #in ...