import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Count { // 操作符数组,优先级从低到高 private static String[] operas = { "#", "+-", "*/", "%^" }; public static String test(String s) { if (null == s) return ""; s += "#"; Pattern num = Pattern.compile("^(\\d+(\\.\\d+)?)(.*)"); Matcher matcher; Stack<String> stack1 = new Stack<String>(); Stack<String> stack2 = new Stack<String>(); char ch; while (s.length() > 0) { matcher = num.matcher(s); // 判断开头是否是数字 if (matcher.find()) { stack2.add(matcher.replaceAll("$1")); s = matcher.replaceAll("$3"); } else { ch = s.charAt(0); s = s.substring(1); // ////////// // / 优先级 '(' ')' // ///////// if ('(' == ch) { stack1.add("" + ch); continue; } else if (ch == ')') { //查看堆栈顶部的对象,但不从堆栈中移除它 while (!stack1.isEmpty() && !("(").equals(stack1.peek())) { stack2.add(calc(stack2.pop(), stack1.pop().charAt(0), stack2.pop())); } if (!stack1.isEmpty()) stack1.pop(); continue; } // //////////// // / 计算表达式 // /////////// if (isOpea(ch)) { while (true) { if (!stack1.isEmpty() && yxj("" + ch, stack1.peek())) { stack2 .add(calc(stack2.pop(), stack1.pop().charAt(0), stack2 .pop())); } else { stack1.add("" + ch); break; } } } else { throw new RuntimeException("表达式非法!!"); } } } return stack2.pop(); } /** * 判断一个字符是否是操作符 * * @param ch * 需要判断的字符 * @return 如果是操作符返回 true 否则返回 false */ private static boolean isOpea(char ch) { for (String str : operas) { if (str.indexOf(ch) != -1) return true; } return false; } /** * 比较操作符的优先级 * * @param str * 第一个操作符 * @param str1 * 第二个操作符 * @return 第一个操作符的优先级高于第二个操作符 返回false 否则返回 true */ private static boolean yxj(String str, String str1) { int stack1 = 0, stack2 = 0; for (int i = 0; i < operas.length; i++) { if (operas[i].indexOf(str) > -1) { stack1 = i; } if (operas[i].indexOf(str1) > -1) { stack2 = i; } } return stack2 >= stack1; } /** * 计算 * * @param stack1 * 操作数1 * @param c * 操作符 * @param stack2 * 操作数2 * @return 返回操作数1和操作数2 经过操作符 c 运算后的结果 */ private static String calc(String stack1, char c, String stack2) { String result = "0"; Double d1 = Double.parseDouble(stack1); Double d2 = Double.parseDouble(stack2); switch (c) { case '+': result = "" + (d1 + d2); break; case '-': result = "" + (d2 - d1); break; case '*': result = "" + (d1 * d2); break; case '/': result = "" + (d2 / d1); break; case '%': result = "" + (d2 % d1); break; case '^': result = "" + (Math.pow(d2, d1)); break; } return result; } public static void main(String[] args) { System.out.println(test("(1+1+1+1*1*2.5*3)/2-1)")); } }
也是在别人这里看到的,给大家分享
相关推荐
逆波兰算法,也称为后缀表达式或波兰后缀表示法,是一种数学表达式的表示方法,主要用于简化计算过程,特别是用于计算机程序中的算术运算。它通过将操作符置于其操作数之后,消除了对括号的需求,使得计算更为直观和...
逆波兰算法,也称为后缀表达式或逆波兰表示法,是一种无括号的数学表达式表示方法。在该表示法中,运算符位于其操作数之后,这使得表达式的计算可以通过栈数据结构来简化。它常用于编译器设计、解析器构建以及计算机...
逆波兰算法,又称后缀表达式算法,是一种基于栈的数据结构来解析和求解数学表达式的方法。它的主要特点是将操作符放在操作数之后,使得表达式求值的过程更为直观和简单。在计算器中,这种算法常用于高效地计算复杂的...
逆波兰算法,又称后缀表达式算法,是一种用于计算表达式的高效方法,它避免了使用括号,并将操作符置于其操作数之后。在MFC(Microsoft Foundation Classes)框架下,我们可以利用C++来实现这样的计算器。MFC是微软...
用法举例: using System; using System.Collections.Generic; using RPN; namespace CSharp_Console { class Program ... public static void Main(string[] args) ... var rpn = new ReversePolishNotation();...
逆波兰算法,也被称为后缀表达式或波兰后缀算法,是计算机科学中用于解析数学表达式的一种高效方法。在编译原理中,它扮演着重要角色,特别是在构造表达式树和实现求值过程时。这个算法是由波兰数学家雅克什·卢卡西...
MFC用逆波兰表达式算法实现计算器的加、减、乘、除等功能,把计算器完全封装在CMyCalculator类中,并具有很好的扩展性和可移植性。数据类型是CString,并用Vector对数据进行入栈、出栈等操作。
逆波兰算法,也称为后缀表达式算法,是计算表达式的一种有效方法,尤其在编程领域,如Android应用开发中的计算器实现中广泛应用。这个算法的主要优点在于它避免了使用堆栈来处理运算符优先级的问题,使得计算过程...
本代码基于vs2017下开发的c++代码,代码主要使用逆波兰算法构建四则运算框架,从而实现计算器程序的构建,此外代码中还加入了三角函数,反三角函数等函数的处理,并且做了表达式的正确性检验,可以作为数据结构以及...
在这个项目中,“QT-科学计算器-可视化-逆波兰算法”显然是一个使用QT框架构建的高级计算器应用,它提供了丰富的数学功能,如处理括号表达式、解决二元一次方程、执行指数和对数运算等。 首先,让我们深入了解一下...
逆波兰算法,也称为后缀表达式算法,是一种在计算表达式时避免使用括号的算法。它基于栈数据结构,使得表达式求值过程更为直观。在这个Java实现的项目中,用户可以配置自定义表达式,系统会动态计算出结果。 首先,...
编译原理下的逆波兰算法 编译原理是计算机科学中的一门重要课程,它涉及到programming language的设计、实现和优化。其中,逆波兰算法是编译原理中的一种重要算法,用于将中缀表达式转换为后缀表达式以便于计算。 ...
逆波兰算法,也被称为后缀表达式算法,是一种在计算领域广泛应用的算法,主要用于解决表达式的求值问题。它的特点是将运算符放置在操作数之后,这样可以避免使用括号来控制运算顺序,使得表达式的解析和计算变得更加...
逆波兰算法,也称为后缀表达式或逆波兰表示法,是一种无括号的数学表达式表示方式,它通过将运算符放在操作数之后来消除运算优先级的困扰。这种算法在计算机科学中广泛用于表达式求值,因为它简化了计算过程。在Java...
表达式求值(逆波兰算法,javascript实现)
利用逆波兰算法实现脚本的解析和计算,支持abs、acos、asin等19种工业常用函数,支持外部变量引用(可以实现强大的扩展功能,规则见文档),已经在商业软件上成功应用。请用VS2017及以上版本打开。
一个用从语言来实现的算法实例,模拟计算机的混合运算机制
大三学生用Java编写逆波兰式计算器是一个很好的学习项目,可以加深对数据结构、算法和面向对象编程的理解。然而,实现"-(A+B)"这样的功能确实有一定难度,因为它需要在逆波兰式中表达嵌套的括号。一种可能的解决...
在本压缩包文件“ExpressionParse”中,我们可以期待找到关于算术表达式解析和逆波兰表示法的模板代码,这将涉及到递归算法的实现。 逆波兰表示法的优势在于,通过栈数据结构可以高效地进行表达式计算,避免了...
逆波兰表示法(Reverse Polish Notation,RPN)是一种数学表达式表示方法,它无需...这将帮助你理解逆波兰表示法的工作机制,以及如何在C++中实现这种算法。同时,这也是一个很好的学习C++和数据结构(栈)的实践案例。