逆波兰表达式解数学运算 感谢作者  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. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT

    题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...

  2. mysql 临时表和内存表

    查看内存表的最大值: show variables like '%heap%'; mysql> show variables like '%heap%'; +------------------ ...

  3. HTTP——学习笔记(1)

    名词解释: 协议: HTTP:HyperText Transfer Protocol,超文本传输协议,属于应用层的协议 FTP:File Transfer Protocol,文件传输协议,相比于HTT ...

  4. The Karplus-Strong Algorithm

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/48730857 Karplus-Stro ...

  5. Codeforces 558E 线段树处理字符串内排序

    给出长度为n的字符串,m个操作. 每一个操作有三个值 l,r,op. op==1,表示将字符串中[ l ,r ]的部分依照升序排列. op==0,表示将字符串中[ l ,r ]的部分依照降序排列. 输 ...

  6. 在Linux的终端中显示BMPString的内容

    在上一篇博文中,介绍了怎样在 Windows 的控制台界面下输出 BMPString 的内容,可是那里的方法在 Linux 下不适用.假设将那里的演示样例代码放到 Linux 下运行.输出的结果为乱码 ...

  7. 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)

    ndk编译C++.提示找不到头文件(ndk-build error: string: No such file or directory) 被这个问题弄得愁眉苦脸啊.心想为啥一个string都找不到呢 ...

  8. Python: PS 滤镜--高反差保留 (High pass)

    本文用 Python 实现 PS 滤镜中的 高反差保留 特效,具体的算法原理和图像效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/deta ...

  9. Kafka框架基础

    * Kafka框架基础 官网:kafka.apache.org 框架简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kaf ...

  10. 1355: [Baltic2009]Radio Transmission

    Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 958  Solved: 659[Submit][Status][Discuss] Description ...