2 solutions
-
1
浅写一个java的
import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String expression = in.nextLine();//注意表达式 List<String> infixExpressionList = toInfixExpressionList(expression); // System.out.println("中缀表达式对应的List=" + infixExpressionList); List<String> suffixExpreesionList = parseSuffExpressionList(infixExpressionList); // System.out.println("后缀表达式对应的List" + suffixExpreesionList); //ArrayList [1,2,3,+,4,*,+,5,–] // String suffixExpression = "4 5 * 8 - 60 + 8 2 / +"; // 76 // List<String> list = getListString(suffixExpression); int res = calculate(suffixExpreesionList); System.out.println(res % 10000); } public static List<String> parseSuffExpressionList(List<String> ls){ Stack<String> s1 = new Stack<>(); // Stack<String> s2 = new Stack<>(); List<String> s2 = new ArrayList<>(); for(String item : ls){ if(item.matches("\\d+")){ s2.add(item); }else if(item.equals("(")){ s1.push(item); }else if(item.equals(")")){ while(!s1.peek().equals("(")){ s2.add(s1.pop()); } s1.pop(); }else { while(s1.size() != 0 && Operation.getValue(s1.peek())>=Operation.getValue(item)){ s2.add(s1.pop()); } s1.push(item); } } while(s1.size() != 0){ s2.add(s1.pop()); } return s2; } public static List<String> toInfixExpressionList(String s){ List<String> list = new ArrayList<String>(); int i = 0; String str; char c; do{ if((c = s.charAt(i)) <48 || (c = s.charAt(i)) > 57){ list.add("" + c);//转换成字符串 i++; }else { str = ""; while( i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) <= 57){ str += c; i++; } list.add(str); } }while(i < s.length()); return list; } public static List<String> getListString(String suffixExpression) { String split[] = suffixExpression.split(" "); List<String> list = new ArrayList<>(); for (String element : split) { list.add(element); } return (list); } public static int calculate(List<String> ls) { Stack<String> stack = new Stack<String>(); for (String element : ls) { if (element.matches("\\d+")) { stack.push(element); } else { int num2 = Integer.parseInt(stack.pop()); int num1 = Integer.parseInt(stack.pop()); int res = 0; if (element.equals("+")) { res = (num1 + num2) % 10000; } else if (element.equals("-")) { res = (num1 - num2) % 10000; } else if (element.equals("*")) { res = (num1 * num2) % 10000; } else if (element.equals("/")) { res = (num1 / num2) % 10000; } else { throw new RuntimeException("运算符有误"); } stack.push("" + res); } } return Integer.parseInt(stack.pop()); } } class Operation{ private static int ADD = 1; private static int SUB = 1; private static int MUL = 2; private static int DIV = 2; public static int getValue(String operation){ int result = 0; switch(operation){ case "+": result = ADD; break; case "-": result = SUB; break; case "*": result = MUL; break; case "/": result = DIV; break; default: break; } return result; } }
Information
- ID
- 290
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 7
- Tags
- # Submissions
- 82
- Accepted
- 19
- Uploaded By