1. 程式人生 > >學習筆記:後綴表達式

學習筆記:後綴表達式

優先級 amp == add else get stringbu exception try

一、中綴表達式轉換為後綴表達式

①掃描中綴表達式。

②遇到數字將其存入後綴表達式。

③遇到左括號將其入棧。

④遇到右括號,出棧運算符並存入後綴表達式,直至遇到左括號,將左括號出棧結束。

⑤遇到運算符,出棧運算符並存入後綴表達式,直到棧頂為優先級更小的運算符、左括號或空棧,將遇到的運算符入棧結束。

⑥掃描結束後將棧中的所有運算符出棧並存入後綴表達式。

二、後綴表達式求解

①掃描後綴表達式。

②遇到數字時將其入棧。

③遇到運算符出棧兩個數字進行運算,將結果入棧。

④掃描結束後棧頂的數字即為最終結果。

三、實現

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner; import java.util.Stack; public class Calculator { private static LinkedList<String> translate(String exp) { HashMap<Character, Integer> priority = new HashMap<>(); priority.put(‘+‘, 0); priority.put(‘-‘, 0); priority.put(
‘*‘, 1); priority.put(‘/‘, 1); LinkedList<String> linkedList = new LinkedList<>(); Stack<Character> stack = new Stack<>(); StringBuilder temp = new StringBuilder(); for (int i = 0; i < exp.length(); i++) { char c = exp.charAt(i);
if (Character.isDigit(c)) { temp.append(c); if (i + 1 == exp.length() || !Character.isDigit(exp.charAt(i + 1))) { linkedList.add(temp.toString()); temp.delete(0, temp.length()); } } else if (c == ‘(‘) { stack.push(c); } else if (c == ‘)‘) { while (!stack.empty() && !stack.peek().equals(‘(‘)) linkedList.add(stack.pop().toString()); stack.pop(); } else { while (!stack.empty() && !stack.peek().equals(‘(‘) && priority.get(c) >= priority.get(stack.peek())) linkedList.add(stack.pop().toString()); stack.push(c); } } while (!stack.empty()) linkedList.add(stack.pop().toString()); return linkedList; } public static int solve(String exp) { LinkedList<String> linkedList = translate(exp); Stack<Integer> cache = new Stack<>(); for (String str : linkedList) try { cache.push(Integer.parseInt(str)); } catch (NumberFormatException exc) { int rhs = cache.pop(); int lhs = cache.pop(); switch (str) { case "+": cache.push(lhs + rhs); break; case "-": cache.push(lhs - rhs); break; case "*": cache.push(lhs * rhs); break; case "/": cache.push(lhs / rhs); break; } } return cache.pop(); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String expr = scanner.nextLine(); System.out.println(solve(expr)); } }

學習筆記:後綴表達式