import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 四则运算 + - * / () * 1、由中缀到后缀 * 2、由后缀算结果 * User: yfzhangbin * Date: 13-12-26 * Time: 上午11:58 */ public class Operation { private static Stack<Character> symbolStack = new Stack<Character>(); private static Stack<Integer> numStack = new Stack<Integer>(); private static Pattern numberPattern = Pattern.compile("\\d*"); // 匹配数字 public static void main(String[] args) { String express = "425-32*2+(8-5*7)*9+1"; // "9+(3-1)*3+10/2"; express = infixToPostfix(express); System.out.println(express); System.out.println(calculate(express)); } /** * 中缀表达式转换成后缀表达式 * @param express 中缀表达式 * @return 后缀表达式 */ private static String infixToPostfix(String express) { boolean isSymbol = false; StringBuilder result = new StringBuilder(); for (int i = 0; i < express.length(); i ++) { char c = express.charAt(i); if (' ' == c) continue; Matcher matcher = numberPattern.matcher(Character.toString(c)); if (matcher.matches()) { if (isSymbol) { // 用来分割数字和算数运算符,用空格隔开 result.append(" "); isSymbol = false; } result.append(c); } else { isSymbol = true; if (symbolStack.size() == 0) { symbolStack.push(c); // 插入第一个符号元素 continue; } if (')' == c) { // 栈顶元素若为')',则依次弹栈直到最近的'('被弹出 char top = symbolStack.pop(); while (top != '(' && symbolStack.size() > 0) { result.append(" ").append(top); top = symbolStack.pop(); } } else if ('+' == c || '-' == c) { // 插入元素若为低优先级的'+','-'时,则先弹出栈顶元素再入栈; 如果当前栈顶元素为'('时,直接入栈 char top = symbolStack.peek(); while (top != '(' && symbolStack.size() > 0) { result.append(" ").append(symbolStack.pop()); if (symbolStack.size() > 0) top = symbolStack.peek(); } symbolStack.push(c); } else { // 字符为(,*,/时直接入栈 symbolStack.push(c); } } } while (symbolStack.size() > 0) { result.append(" ").append(symbolStack.pop()); } return result.toString(); } /** * 后缀表达式的运算 * @param express 后缀表达式 * @return 运算结果 */ private static int calculate(String express) { String[] parts = express.split(" "); for (String part : parts) { Matcher matcher = numberPattern.matcher(part); if (matcher.matches()) { numStack.push(Integer.parseInt(part)); } else if (numStack.size() >= 2) { int n2 = numStack.pop(); int n1 = numStack.pop(); //System.out.println(n1 + part +n2); // 打印运算过程 if ("*".equals(part)) { numStack.push(n1 * n2); } else if ("/".equals(part)) { numStack.push(n1 / n2); } else if ("+".equals(part)) { numStack.push(n1 + n2); } else if ("-".equals(part)) { numStack.push(n1 - n2); } } } return numStack.pop(); } }
相关推荐
基本思路是:设中缀表达式的字符串为s1,用来存放后缀表达式的字符串为s2,从头到尾扫描中缀表达式中的每个字符,若是空格则不做任何处理,若是数字或者小数点,这直接写入s2中,并在每个数字的最后写入一个空格,如遇到的是...
该程序实现了运算表达式转换为中缀表达式、中缀表达式转换为后缀表达式及后缀表达式求值。该程序已实现加减乘除括号运算符及求余、幂指数的求解
将由数字和四则运算符组成的后缀表达式变换为中缀表达式。输入的后缀表达式包含的运算符不超过15个。要求转换后的中缀表达式中不应出现不必要的括号。例如,整个表达式两端的括号要省略,不影响原计算顺序的括号要...
以表达式树的形式进行编码,能够输出结点和右节点,以及右节点的右节点(如果存在)的表达式符号,并且输出计算结果。
按照惯例,算术表达式一般都写成中缀形式,即运算符总是出现在两个操作数之间,单目运算符除外),称为中缀表达式.编译系统对中缀表达式的处理... (1) 将中缀表达式转换为后缀表达式; (2) 根据后缀表达式计算表达式的值;
我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式 (A 一 (B*C 十 D)*E) / (F 十 G ) 转换为后缀表示为: ABC*D十E*—FG十/ 注意:为了简化编程实现,假定变量名均为...
中缀表达式转换为后缀表达式(oj题库) 中缀表达式转换为后缀表达式(oj题库) 题目描述 中缀表达式是一个通用的算术或逻辑公式表示方法,操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的...
数据结构C++版,将中缀表达式变换为后缀并用后缀表达式求值,支持运算符包括+,-,*,/,^,(),支持小数,负数,多位数运算
将一个表达式转为后缀表达式,用堆栈计算 中缀转后缀的过程中遇到数字直接输出,遇到符号则判断优先级。
中缀表达式到后缀表达式的转换,再计算四则运算,包括+,-,*,/,(,)
数据结构的中缀表达式转后缀表达式,通过C++语言实现。使用堆栈方法进行转换,能正确运算包含括号、加、减、乘、除复合运算,如(1+2)*3-1.8*(18/(7+2)) = 8.2。
目前该转换算法只支持数字在0至9之间的+-*/四元运算转换.*/ /**************程序员信息 ***************东北大学*******************东大很厉害**************** ***************软件学院*******************软件...
不错 中缀表达式转后缀表达式 简单表达式运算
中缀 转换成 后缀表达式的 计算 多位数
输入一个中缀表达式,将其转换为等价的后缀表达式后输出并计算结果。
一个编译原理中缀转后缀表达式(递归下降翻译成AST,后序遍历得到后缀)的 Java 程序,读取文件中的中缀表达式(每个表达式以分号结束,文件中可以有多个表达式)并转换为等价的后缀表达式后输出到屏幕上, 表达式中...
设计思路:从键盘输入中缀表达式,然后将中缀表达式转换为后缀表达式,利用后缀表达式求值。要求以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算术符优先关系,实现对算数四则混合运算...
数据结构课程实验,实现了终端输入输出的中缀表达式求值,后缀表达式求值,中缀表达式转化后缀表达式,以及文件流的中缀表达式求值,后缀表达式求值,中缀表达式转化后缀表达式,可操作整数,小数,浮点数,实现运算 ...
数据结构的一些算法。由中缀表达式转换成后缀表达式然后计算结果,以后如果有需要还可以联系我