公司笔试题——逆波兰式
来源:互联网 发布:大主宰手游数据库修改 编辑:程序博客网 时间:2024/04/28 15:26
逆波兰表达式特性:
后缀表达式——1,遇数字进栈;
2,遇符号取出栈顶前两位进行运算,再进栈;
3,最后求得的值出栈输出;
中缀表达式转后缀表达式——1,优先级较低的进栈遇到优先级较高情形,分别与栈中元素从栈顶比较,若优先级小 于等于栈顶元素,则栈顶元素出栈,再接着与下一个栈顶元素比对,直到比栈顶元 素小为止;
2,数字不进栈输出;
3,括号配对后要将夹在中间的值输出;
实例:
<span style="font-size:24px;">package 逆波兰式;import java.util.ArrayList;import java.util.List;import java.util.Stack;import java.util.regex.Matcher;import java.util.regex.Pattern;import 逆波兰式.StrategePattern.contextFactory;public class NBLprocess {public static void main(String[] args) { String str = "9 3 1 - 3 * + 10 2 / +"; System.out.println(NBLcompute(str)); String str1 = "9 + ( 3 - 1 ) * 3 + 10 / 2"; System.out.println(NBLconvert(str1)); }/** * 逆波兰式中缀转后缀表达式 * @param str1 */private static String NBLconvert(String str1) {String[] arr = str1.split("\\s+");List<String> lst = new ArrayList<String>(); Pattern p = Pattern.compile("[0-9]|[0-9]{2}"); StringBuilder sb = new StringBuilder(); Stack stk = new Stack();for(String s : arr){Matcher m = p.matcher(s);if(m.matches()){sb.append(s + " ");}else{if(s.equals(")")){String temp = null;while(!(temp = stk.pop().toString()).equals("(")){sb.append(temp + " ");}}else if((s.equals("+") || s.equals("-")) && !stk.isEmpty()){String temp = stk.pop().toString();if(temp.equals("*") || temp.equals("/")){sb.append(temp + " ");while(!stk.isEmpty()){sb.append(stk.pop().toString() + " ");}stk.push(s);}else{stk.push(temp);stk.push(s);}}else{stk.push(s);}}}while(!stk.isEmpty()){sb.append(stk.pop().toString() + " ");}return sb.toString();}/** * 逆波兰后缀表达式计算 * @param str * @return */private static String NBLcompute(String str) {String[] arr = str.split("\\s+"); Pattern p = Pattern.compile("[0-9]|[0-9]{2}"); StrategePattern sp = new StrategePattern(); Stack stk = new Stack(); for(String s : arr){ Matcher m = p.matcher(s); if(m.matches()){ //匹配数字的入栈 stk.push(s); }else{ //不匹配数字的前两值出栈计算 String a = stk.pop().toString(); String b = stk.pop().toString(); int a1 = Integer.parseInt(a); int b1 = Integer.parseInt(b); int max = a1 > b1 ? a1 : b1; int min = a1 < b1 ? a1 : b1; contextFactory cf = new contextFactory(s); stk.push(cf.getResult(max, min)); } } return stk.pop().toString();}}</span>四则表达式的策略模式:
package 逆波兰式;public class StrategePattern {/** * 算法抽象父类 * @author Administrator * * @description * * 20142014年9月5日上午10:38:03 * */public static interface algorithm{ public int getResult(int a,int b);}/** * 四则运算类 * @author Administrator * * @description * * 20142014年9月5日上午10:38:19 * */public static class add implements algorithm{@Overridepublic int getResult(int a,int b) {return a+b;}}public static class dec implements algorithm{@Overridepublic int getResult(int a, int b) {return a-b;}}public static class multi implements algorithm{@Overridepublic int getResult(int a, int b) {return a*b;}}public static class div implements algorithm{@Overridepublic int getResult(int a, int b) {return a/b;}}/** * 工厂类 * @author Administrator * * @description * * 20142014年9月5日上午10:39:08 * */public static class contextFactory{algorithm alg;public contextFactory(String type) {switch (type) {case "+":alg = new add();break;case "-":alg = new dec();break;case "*":alg = new multi();break;case "/":alg = new div();break;default:break;}}public int getResult(int a,int b){return alg.getResult(a, b);}}//测试public static void main(String[] args) {contextFactory context = new contextFactory("+");System.out.println(context.getResult(10, 1));}}
输出结果:
20
9 3 1 - 3 * + 10 2 / +
0 0
- 公司笔试题——逆波兰式
- 波兰式转为逆波兰式——2016年华为笔试最后一题
- 叫你如何快速得到逆波兰表达式——适用于笔试题
- 阿里笔试-逆波兰表达式
- 公司笔试题——fork
- 阿里2017实习生招聘笔试-编程题-逆波兰
- 2017 实习生 阿里巴巴 java笔试题 逆波兰表达式
- 波兰式,逆波兰式
- 四则运算——逆波兰
- 波兰式和逆波兰式
- 逆波兰式与波兰式
- 波兰式转换为逆波兰式
- 公司笔试题——最长公共子序列
- 小米2018笔试题——公司饮料太便宜
- 计算逆波兰式——Leetcode系列(一)
- 栈(二)——用栈来实现逆波兰式
- IT公司笔试题
- 。。。公司笔试题
- Linux PID namespace cgroup namespace container
- mysql 重启
- 利用form的“accept-charset”在不同编码的页面间提交表单
- 再谈应用环境下的TIME_WAIT和CLOSE_WAIT
- PAT--我要通过!
- 公司笔试题——逆波兰式
- Ubuntu 终端下常用命令
- 滚动条下拉DIV固定在头部不动
- C++ 学习笔记_0010_(完数、判断素数、判断回文数)
- C++学习路线
- Box2D v2.1.0用户手册(1)——导言(Introduction)
- LoadRunner上传附件脚本
- Android 桌面快捷方式的创建与删除
- 正则表达式学习小结