逆波兰表达式解数学运算(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_逆波兰表达式计算/后缀表达式计算
有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...
随机推荐
- jQuery第四课 点击 _选项卡效果一
//鼠标移到上面是显示手型cursor:pointer jquery 的函数: siblings //兄弟节点,同胞元素 :eq()选择器选取带有指定 index 值的元素.index 值从 0 开始 ...
- thinkphp5 编辑时 唯一验证 解决办法
若定义了相关的验证规则,如: namespace app\seller\validate; use think\Validate; class Goodsmtag extends Validate { ...
- Vue2.0父子组件间事件派发机制
从vue1.x过来的都知道,在vue2.0中,父子组件间事件通信的$dispatch和$broadcase被移除了.官方考虑是基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会 ...
- 榨取kkksc03 luogu1855 dp 裸二维费用背包
首先对于这个题目背景,,个人认为很(you)好(qu),,, 核心就是一个裸的二维费用背包,刚刚学习的同学参见dd大牛的背包九讲 #include <cstdio> #include &l ...
- 项目集成Hudson+SonarQube出现的一个问题
[ERROR] No plugin found for prefix 'sonar' in the current project and in the plugin groups [org.mort ...
- Objective-C的陷阱与缺陷
Objective-C是一个强大而且非常有用的语言,但是同样也是有一点危险的.这次主题是受到一篇有关C++陷阱的文章启发,来聊聊Objective-C和Cocoa中的陷阱. 简介 我将和Horstma ...
- excle查找操作-vlookup的使用心得
百度了一下vlookup的语法规则: 该函数的语法规则例如以下: VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) 參数 简单说 ...
- hdu_4430,二分
注意处理溢出 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...
- 怎么去除innerHTML获得内容中的标签?
去掉innerHTML获得内容里面的标签: <body> <div id="d1"><p id="p1">hello wor ...
- Windows Phone相关
Windows Phone IP over USB Transport (IpOverUsbSvc) is not running 进“服务”搜索 “Windows Phone IP Over USB ...