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(); } }
相关推荐
在本项目中,“java堆栈的应用--中缀表达式转换成后缀表达式和计算”具体涉及到了两个主要知识点:中缀表达式的转换与后缀表达式的计算。 1. **中缀表达式**:这是我们常见的数学表达式形式,如 `2 + 3 * 4`,其中...
在计算机科学领域,表达式转换是一个重要的概念,特别是在编译原理和算法设计中。中缀表达式是我们常见的数学表达式形式,例如 \(2 + 3 \times 4\),而后缀表达式(也称为逆波兰表示法)是将运算符放在操作数之后的...
这里我们关注的是将中缀表达式转换为后缀表达式,也称为逆波兰表示法(Reverse Polish Notation, RPN)。这个过程是通过使用数据结构栈来完成的,对于理解和编写计算表达式的程序至关重要。下面我们将详细探讨这一...
在这个实验中,你将涉及三个主要概念:中缀表达式、后缀表达式以及影子树。这些概念在编译原理、解析器设计以及计算理论中都有广泛应用。 首先,**中缀表达式**是我们日常数学运算中常见的表达方式,例如 "2 + 3 * ...
通过使用栈,可以将中缀表达式转换为后缀表达式,然后计算机可以按照后缀表达式的顺序执行运算。 后缀表达式的优点 后缀表达式有很多优点,可以使计算机更好地理解和执行算术表达式。首先,后缀表达式可以减少...
在这个程序中,还实现了前缀表达式转换为后缀表达式,前缀表达式与中缀表达式类似,只是运算符位于操作数之前,如 `+ 2 3`。转换过程与中缀转后缀类似,只是在比较运算符优先级时需反向处理。 此外,程序支持了加、...
以表达式树的形式进行编码,能够输出结点和右节点,以及右节点的右节点(如果存在)的表达式符号,并且输出计算结果。
按照惯例,算术表达式一般都写成中缀形式,即运算符总是出现在两个操作数之间,单目运算符除外),称为中缀表达式.编译系统对中缀表达式的处理... (1) 将中缀表达式转换为后缀表达式; (2) 根据后缀表达式计算表达式的值;
将由数字和四则运算符组成的后缀表达式变换为中缀表达式。输入的后缀表达式包含的运算符不超过15个。要求转换后的中缀表达式中不应出现不必要的括号。例如,整个表达式两端的括号要省略,不影响原计算顺序的括号要...
3. **中缀表达式转换为后缀表达式**: 中缀表达式是我们通常看到的数学表达式形式,如"2 + 3 * 4"。转换过程需要用到两个栈:一个运算符栈和一个临时结果栈。遍历表达式,遇到数字直接输出,遇到运算符时,若其...
我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式 (A 一 (B*C 十 D)*E) / (F 十 G ) 转换为后缀表示为: ABC*D十E*—FG十/ 注意:为了简化编程实现,假定变量名均为...
然而,在计算机处理时,后缀表达式(也称为逆波兰表示法)通常更为方便,因为它不需要括号来明确运算顺序,如 \(2 3 4 * +\)。这个转换过程涉及到了栈这一数据结构。 栈是一种具有“后进先出”(LIFO, Last In ...
在将中缀表达式转换为前缀或后缀表达式时,通常需要遵循运算符优先级,并应用适当的转换规则。主要步骤包括:首先对所有的运算单位加上括号以明确优先级,然后将运算符移动到对应括号的前面或后面,最后去掉括号,...
数据结构C++版,将中缀表达式变换为后缀并用后缀表达式求值,支持运算符包括+,-,*,/,^,(),支持小数,负数,多位数运算
中缀表达式转换为后缀表达式,是计算机科学中数据结构领域的一种常见问题,主要涉及到操作符优先级和括号处理。这个问题在程序设计中经常出现,特别是在编译原理和算法课程中。中缀表达式是我们日常使用的数学表达式...
本文件主要讨论的是一个具体的数据结构问题,即如何将中缀表达式转换为后缀表达式,这是编译原理中的一个经典议题。中缀表达式是我们日常生活中常见的运算表达方式,如5+6*8,而后缀表达式,又称逆波兰表示法,是...
本文将详细讨论如何将中缀表达式转换为后缀表达式(也称为逆波兰表示法),并结合“表达式树”这一概念进行阐述。在这个过程中,我们将使用VC6.0作为开发环境,但它同样适用于其他编程语言和环境。 首先,我们了解...
这个文档“数据结构-3期(KC002)中缀表达式转换为后缀表达式.docx”主要探讨了如何将常见的数学中缀表达式转换为后缀表达式,也称为逆波兰表示法。这种转换对于计算和解析表达式非常有用,因为它消除了括号的需求,...
### 获取键盘输入一个中缀表达式,将它转换成后缀表达式,并输出结果 #### 知识点一:中缀表达式与后缀表达式的概念 - **中缀表达式**:通常我们书写的数学表达式就是中缀表达式,如`3 + 4 * 2`。在中缀表达式中,...