package com.itranswarp.learnjava; import java.util.*; /** * Learn Java from https://www.liaoxuefeng.com/ * * @author liaoxuefeng */ public class Main { public static void main(String[] args) { String exp = "x + 2 * (y - 5)"; SuffixExpression se = compile(exp); Map<String, Integer> env = Map.of("x", 1, "y", 9); int result = se.execute(env); System.out.println(env); System.out.println(exp + " = " + result + " " + (result == 1 + 2 * (9 - 5) ? "yes" : "no")); } static SuffixExpression compile(String exp) { // TODO: Deque<String> nums = new LinkedList<>(); Deque<String> symbols = new LinkedList<>(); for (int i = 0; i < exp.length(); i++) { String n = exp.charAt(i) + ""; if (n.equals(" ") || n.equals("(") || n.equals(")")) continue; if (n.equals("+") || n.equals("-") || n.equals("*") || n.equals("/")) { symbols.push(n); continue; } nums.push(n); } return new SuffixExpression(nums, symbols); } } class SuffixExpression { Deque<String> nums; Deque<String> symbols; public SuffixExpression(Deque<String> nums, Deque<String> symbols) { this.nums = nums; this.symbols = symbols; } int execute(Map<String, Integer> env) { // TODO: int res = 0; while (symbols.size() != 0) { String last = nums.pop(); String pre = nums.pop(); String symb = (String) symbols.pop(); int lastV = env.get(last) == null ? Integer.parseInt(last): env.get(last); int preV = env.get(pre) == null ? Integer.parseInt(pre): env.get(pre); switch(symb) { case "+": res = preV + lastV; break; case "-": res = preV - lastV; break; case "*": res = preV * lastV; break; case "/": res = preV / lastV; break; } nums.push(res + ""); } return res; } }
Sign in to make a reply
D