逆波兰表达式解数学运算(c#)
逆波兰表达式解数学运算 感谢作者 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#)的更多相关文章
- CH BR4思考熊(恒等有理式-逆波兰表达式求值)
恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...
- 关于利用STL栈求解四则中缀表达式以及中缀表达式转逆波兰表达式和逆波兰表达式的求解
今天总结一下栈的一个重要应用---四则数学表达式的求解 数学表达式的求解是栈的一个重要的应用,在计算机的应用中 如果求解一个四则运算表达式,我们可能会直接写一个程序例如什么printf("% ...
- [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- noi1696 逆波兰表达式
1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1&q ...
- SDIBT2666——逆波兰表达式求值
逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...
- c++实现将表达式转换为逆波兰表达式
https://github.com/Lanying0/lintcode 所属: 数据结构->线性结构->栈 问题: 给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号). ...
- 逆波兰表达式的C实现
复习下数据结构,用栈简单实现逆波兰表达式,参考文档: http://www.nowamagic.net/librarys/veda/detail/2307 http://www.nowamagic.n ...
- LeetCode_p150_逆波兰表达式计算/后缀表达式计算
有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...
随机推荐
- LINUX 中 python 版本升级
首先下载源tar包 可利用linux自带下载工具wget下载,如下所示: 1 # wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tg ...
- oracle 11G 配置侦听文件
lsnrctl status 130 2017-08-23 03:15:16 oracle cat /etc/hosts 131 2017-08-23 03:15:26 oracle ca ...
- 紫书 习题 8-20 UVa 1620 (找规律+求逆序对)
这道题看了半天没看出什么规律, 然后看到别人的博客, 结论是当n为奇数且逆序数为奇数的时候 无解, 否则有解.但是没有给出证明, 在网上也找到详细的证明--我也不知道是为什么-- 求逆序对有两种方法, ...
- 设计模式之Mediator模式(笔记)
中介者模式:用一个中介对象来封装一系列的对象交互. 中介者使各对象不须要显式的相互引用,从而使其耦合松散.并且能够独立的改变它们之间的交互. 使用场合:中介者模式一般应用于一组对象以定义良好可是复杂的 ...
- OpenCASCADE直线与平面求交
OpenCASCADE直线与平面求交 在<解析几何>相关的书中都给出了直线和平面的一般方程和参数方程.其中直线的一般方程有点向式形式的. 由于过空间一点可作且只能作一条直线平行于已知直线, ...
- 【RQNOJ】460 诺诺的队列
[题目大意] 求全部数对(i,j)满足随意a[k]<=a[i]且a[k]<=a[j]. 形象地说,就是有一群人站成一列.每一个人有一定的身高,然后问有多少对人能够互相看得到. 把数对(i, ...
- 怎样在Ubuntu手机平台中开发Cordova HTML5应用
我们知道Cordova HTML5应用具有夸平台的特性,同一时候也具有訪问本地一些资源的能力.在今天的这篇文章中.我们将介绍一下怎样创建并执行一个Cordova HTML5的应用到我们的Ubuntu手 ...
- php使用flock堵塞写入文件和非堵塞写入文件
php使用flock堵塞写入文件和非堵塞写入文件 堵塞写入代码:(全部程序会等待上次程序运行结束才会运行,30秒会超时) <?php $file = fopen("test.txt&q ...
- python-网络-tcp
python-网络-tcp 标签(空格分隔): python TCP[client]-发送数据 from socket import * s = socket(AF_INET, SOCK_STREAM ...
- Andoid 更好的Android多线程下载框架
概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度 ...