逆波兰表达式解数学运算(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 安装常用库
在CentOS安装软件的时候,可能缺少一部分支持库,而报错.这里首先安装系统常用的支持库.那么在安装的时候就会减少很多的错误的出现. [root@bogon 桌面]# yum install -y ...
- Linux bash常用快捷键
移动光标 ctrl-a 光标移动到行首 ctrl-e 光标移动到行尾 ctrl+xx 在行首和光标位置直接切换 ctrl-b 光标左移一位 ctrl-f 光标右移一位 alt-b 光标左移一词 alt ...
- [JAVA · 0基础]:3.转义字符
定义 全部的ASCII码都能够用"\"加数字(通常是8进制数字)来表示.而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\ ...
- js php 数组比較
php 与 javascript 数组除了定义以及 操作上有非常大的差别,还有非常多其他的差别.如今我们就来讨论讨论. 1.大家都知道php比較两个数组是否全相等(值,索引)相等 $a=arra ...
- Linux/UNIX线程(1)
线程(1) 本文将介绍怎样使用多个控制线程在单个进程环境中运行多个任务. 一个进程中的全部线程都能够訪问该进程的组成部件(如文件描写叙述符和内存). 线程包含了表示进程内运行环境必须的信息,当中包含进 ...
- iOS自动布局高级用法 && 纯代码约束写法
本文主要介绍几个我遇到的总结的高级用法(当然我相信肯定有不少比这还高级的). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以后 ...
- sicily 1003. hash
Description 请用HASH链式法来解决冲突,且规定链表在链表头插入新元素. 规定HASH函数为:h(x) = x % 11,即哈希数组下标为0-10. 给定两种操作: I 操作,插入一个新的 ...
- HDU 4786Fibonacci Tree(最小生成树)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Sql Server 基本数据类型
第一大类:整数数据 bit:bit数据类型代表0,1或NULL,就是表示true,false.占用1byte. int:以4个字节来存储正负数.可存储范围为:-2^31至2^31-1. smallin ...
- codeforces 495D Sonya and Matrix
Since Sonya has just learned the basics of matrices, she decided to play with them a little bit. Son ...