题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
package org.example.test.practice.third; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s = br.readLine(); if (s.startsWith("-")){ s = "(0-1)*"+s.substring(1); } s = s.replace("(-", "((0-1)*"); System.out.println(s); Deque<Object> endPrefix = new LinkedList<>(); Deque<Character> stack = new LinkedList<>(); Map<Character, Integer> pro = new HashMap<>(); pro.put('+', 1); pro.put('-', 1); pro.put('*', 2); pro.put('/', 2); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (Character.isDigit(c)) { int n = 0; while (Character.isDigit(c)) { n = n * 10 + (c - '0'); i++; if (i >= s.length()) { break; } c = s.charAt(i); } endPrefix.push(n); i--; } else { if (c == '(') { stack.push(c); } else if (c == ')') { while (!stack.isEmpty() && stack.peek() != '(') { endPrefix.push(stack.pop()); } stack.pop(); } else { while (!stack.isEmpty() && (stack.peek() != '(' && pro.get(stack.peek()) >= pro.get(c))) { endPrefix.push(stack.pop()); } stack.push(c); } } } while (!stack.isEmpty()) { endPrefix.push(stack.pop()); } Deque<Integer> computStack = new LinkedList<>(); while (!endPrefix.isEmpty()) { Object o = endPrefix.pollLast(); if (o.toString().equals("+")) { int a = computStack.pop(); int b = computStack.pop(); computStack.push(a + b); } else if (o.toString().equals("-")) { int a = computStack.pop(); int b = computStack.pop(); computStack.push(b - a); } else if (o.toString().equals("/")) { int a = computStack.pop(); int b = computStack.pop(); computStack.push(b / a); } else if (o.toString().equals("*")) { int a = computStack.pop(); int b = computStack.pop(); computStack.push(a * b); } else { computStack.push((Integer) o); } } System.out.println(computStack.peek()); } }