中缀表达式转后缀表达式并计算结果
2017-03-19 00:22
375 查看
测试数据要求:非负整型数,支持包含括号的四则运算
示例:
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; import java.util.Stack; public class Postfix { public static void main(String[] args) { Scanner sr = new Scanner(System.in); Queue postfix = getPostfix(sr.next()); int result = getResult(postfix); System.out.println(result); } /** * * @param postfix 后缀表达式在队列中的形式 * @return 后缀表达式的计算结果 */ private static int getResult(Queue postfix) { Stack<Integer> numbers = new Stack<Integer>(); while(!postfix.isEmpty()){ Object temp = postfix.poll(); //判断temp类型,如果是Integer就入栈,如果是Character就进行运算 if(temp instanceof Integer) numbers.push((Integer)temp); else{ //先出栈的是操作数B int numB = numbers.pop(); int numA = numbers.pop(); switch ((Character)temp) { case '+': numA += numB; break; case '-': numA -= numB; break; case '*': numA *= numB; break; case '/': numA /= numB; break; } //最后记得将运算结果入栈 numbers.push(numA); } } //返回运算结果(栈底) return numbers.get(0); } /** * * @param ss 中缀表达式 * @return 后缀表达式在队列中的形式 */ private static Queue getPostfix(String ss) { Stack<Character> ops = new Stack<Character>(); Queue<Object> postfixs = new LinkedList<Object>(); for(int i=0;i<ss.length();i++){ char temp = ss.charAt(i); //1.如果是数字就加入队列 if(Character.isDigit(temp)){ int number = 0; //数字拼接 while(i < ss.length() && Character.isDigit(ss.charAt(i))){ number = number*10 + Integer.parseInt(ss.substring(i,i+1)); i++; } //i多加了一次,记得减掉 i--; postfixs.offer(number); } //2.如果是'('就入栈 else if(temp == '(') ops.push(temp); //3.如果是')'就出栈并加入队列直到'('出栈,其中'('只出栈不加入队列 else if(temp == ')'){ char popChar = ops.pop(); while(popChar != '('){ postfixs.offer(popChar); popChar = ops.pop(); } } //4.如果是操作符的逻辑处理 else{ int rank = getRank(temp); //4.1.如果栈空或者权值比栈中前一个操作符权值大,则入栈 if(ops.isEmpty() || rank > getRank(ops.peek())) ops.push(temp); //4.2.1否则出栈,直到栈空或者权值比栈中前一个操作符权值大 else { while(!ops.isEmpty() && rank <= getRank(ops.peek())) postfixs.offer(ops.pop()); //4.2.2最后记得将当前操作符入栈 ops.push(temp); } } } //5.将堆栈中剩余操作符加入队列 while(!ops.isEmpty()) postfixs.offer(ops.pop()); return postfixs; } /** * * @param c 字符 * @return 输入字符的权值 */ private static int getRank(char c){ switch (c) { case '+': case '-': return 1; case '*': case '/': return 2; } return -1; } }
示例:
相关文章推荐
- Java实现中缀表达式转后缀表达式并计算结果
- 中缀表达式转为后缀表达式,并计算结果
- 学习日志-中缀表达式转后缀表达式并计算结果
- 数据结构实现中缀表达式到后缀表达式,再到计算出结果的代码
- 【综合】中缀表达式转换成后缀表达式后,用后缀表达式计算出结果
- 中缀表达式转后缀表达式并输出计算结果
- 中缀表达式转化为后缀表达式,计算中缀表达式,计算后缀表达式(有注释)(逆波兰表达式)
- 中缀表达式转后缀表达式 (中缀表达式的计算)
- 中缀表达式转后缀表达式并计算后缀表达式的值...
- java中的栈Stack的基本使用和应用(二) ——利用栈计算合法的算术表达,中缀表达式转后缀表达式
- 前缀表达式、后缀表达式和中缀表达式的计算(double型)
- 中缀表达式/前缀表达式/后缀表达式 的计算方法
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- 中缀表达式与后缀表达式的转化与计算
- 中缀表达式转后缀表达式,以及计算结果.
- java实现中缀表达式转后缀表达式并且计算
- 算式类型字符串表达式读取并计算出结果(简单四则运算)--后缀表达式计算
- 蓝桥杯 算法训练:表达式计算 中缀表达式变后缀表达式
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
- 用堆栈把中缀表达式转化为后缀表达式,之后再求后缀表达式结果