用Java实现基本计算器
Leetcode_T227 基本计算器||(双栈解法)
给你一个字符串表达式 s ,s 由整数和算符 (+, -, *, /) 组成,中间由一些空格隔开
请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分
整体思路:用两个栈s1和s2,s1用于存储数据,s2用于存储运算符 s1存储数据时,注意对于两位数以上的数据,要循环读取数据 s2存储运算符,因为运算符有优先级,所以当遇到优先级低的,则先将栈内优先级高的运算符拿出与s1中的数据进行运算,并将运算结果返回s1中,再继续读取,就是先将优先级高的计算出结果,再继续进行其他运算 【注意】对于减法、除法,不要将被减数,被除数与减数、除数写反
代码实现:
import java.util.Deque; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; //基本计算器|| //运算优先级-双栈解决 public class Leetcode_T227 { public int calculate(String s) { int res = 0; s = s.replaceAll(" ", ""); Deque<Integer> stack1 = new LinkedList<>(); Deque<Character> stack2 = new LinkedList<>(); Map<Character, Integer> map = new HashMap<>(); map.put(+, 1); map.put(-, 1); map.put(*, 2); map.put(/, 2); int n = s.length(); for (int i = 0; i < n; i++) { // 如果是运算符 if (map.containsKey(s.charAt(i))) { // 借助栈,将优先级高的先进行运算 while (!stack2.isEmpty() && map.get(s.charAt(i)) <= map.get(stack2.peek())) { Character x = stack2.pop(); int a1 = stack1.pop(); int a2 = stack1.pop(); stack1.push(calculateMethod(a2, x, a1)); } stack2.push(s.charAt(i)); } // 如果是数字 else { int num = 0; int j = i; // 循环读取两位数以上的数字 while (j < n && Character.isDigit(s.charAt(j))) { num = num * 10 + s.charAt(j) - 0; j++; } stack1.push(num); i = j - 1; } } // 当走完整个循环,如若stack2中还有运算符,继续算完 while (!stack2.isEmpty()) { Character x = stack2.pop(); int a1 = stack1.pop(); int a2 = stack1.pop(); stack1.push(calculateMethod(a2, x, a1)); } return stack1.pop(); } public int calculateMethod(int a, char b, int c) { switch (b) { case +: return a + c; case -: return a - c; case *: return a * c; case /: return a / c; } return -1; } }
下一篇:
OS开发之底层内存管理笔记