中缀转后缀
2016-03-05 02:45
295 查看
当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。
如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。
在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理)的时候,否则决不从栈中移走”(”。操作符中,+-优先级最低,()优先级最高。
如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中。
运行结果:
如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。
在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理)的时候,否则决不从栈中移走”(”。操作符中,+-优先级最低,()优先级最高。
如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中。
public static void main(String[] args) { BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in)); String str; try { while ((str = bReader.readLine()) != null) { System.out.println(infix2postfix(str)); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
public static int priorityOfOperator(String string) { //数字的优先级最低,设为-1 int priority = -1; if (string.equals("+") || string.equals("-")) { priority = 0; } else if (string.equals("*") || string.equals("/")) { priority = 1; } else if (string.equals("(") || string.equals(")")) { priority = 2; } return priority; }
/* 中缀转后缀 */ public static String infix2postfix(String string) { MyStack<String> myStack = new MyStack<String>(); StringBuilder postfix = new StringBuilder(); String[] ss = string.trim().split(" "); for (String string2 : ss) { // 如果该元素是数字,则直接追加到postfix后面 if (priorityOfOperator(string2) == -1) { postfix.append(string2).append(" "); } else { // 如果是操作符,首先判断是不是),如果是 )则从栈中弹出元素直到遇到对应的 ) if (string2.equals(")")) { String tmp; while (!myStack.empty()) { tmp = (String) myStack.pop(); if (tmp.equals("(")) { break; } postfix.append(tmp).append(" "); } } // 如果操作符不是 ),则判断现在的操作符的优先级是不是 <= 栈顶的符号的优先级,如果是, // 则弹出栈中的元素直到遇到以下三种情况: // (1)栈已经空了; // (2)遇到( 了; // (3)遇到优先级更低的符号了。 else { if (myStack.empty()) { myStack.push(string2); } else { if (priorityOfOperator(string2) <= priorityOfOperator((String) myStack.peak())) { String tmp; while (!myStack.empty()) { tmp = (String) myStack.peak(); if (tmp.equals("(") || priorityOfOperator(tmp) < priorityOfOperator(string2)) { break; } postfix.append(tmp).append(" "); myStack.pop(); } myStack.push(string2); } else { myStack.push(string2); } } } } } //输入已经结束,如果栈中还有符号,全部输出 while (!myStack.empty()) { postfix.append((String)myStack.pop()).append(" "); } return postfix.toString(); }
运行结果:
相关文章推荐
- CSS HTML实现背景图片的填充
- UITableView介绍 之 网络图片数据加载
- LeetCode Strobogrammatic Number
- 大数据架构和模式(二)如何知道一个大数据解决方案是否适合您的组织
- LinuxMint17.3配置全局变量
- 第一期:搭建什么样的多用户平台?(未完)
- 第二期: 如何搭建 多用户的平台?(未完)
- 大数据架构和模式(三)理解大数据解决方案的架构层
- 如何避免编程中的BUG
- swift:CoreData简单入门(增加、查询、修改、删除)(详细讲解)
- ThreadLocal源码分析解密
- ubuntu 14.04 开机添加磁盘挂载
- bootstrap相关
- JavaScript-正则表达式总结
- 25该何去何从
- weblogic
- 微信js sdk 分享 失败 有时候好 有时候坏
- ssm框架整合笔记-1-基础框架搭建
- javascript中的BOM知识点总结
- Node.js是什么