本文共 1907 字,大约阅读时间需要 6 分钟。
实现一个计算器。给定一个字符串s,字符串s中的字符由'0'-'9'的数字以及'+'、'-'、'*'、'/'以及空格组成。要求求出字符串s所代表表达式的结果。例子:
构造两个栈,一个为操作数栈,里面存放操作数(整数);一个为操作符栈,里面存放四种运算符(字符)。
// 两个相邻数字之间没有空格class Solution { public int calculate(String s) { ArrayListnums = new ArrayList<>(); // 构造操作数栈 ArrayList op = new ArrayList<>(); // 构造操作符栈 char pre = ' '; for (char c : s.toCharArray()) { if (c != ' ') { // 当前字符是数字 if (c >= '0' && c <= '9') { // 如果前一个字符也是数字 if (pre >= '0' && pre <= '9') { if (nums.size() > 0) nums.add(nums.remove(nums.size() - 1) * 10 + (c - '0')); else nums.add(c - '0'); } else { nums.add(c - '0'); } } else { // 当前数字是操作符 op.add(c); } } pre = c; } int idx = 0; // 先处理乘除法 while (idx < op.size()) { char c = op.get(idx); if (c == '*' || c == '/') { op.remove(idx); int num1 = nums.get(idx), num2 = nums.get(idx + 1); if (c == '*') nums.set(idx, num1 * num2); else nums.set(idx, num1 / num2); nums.remove(idx + 1); continue; } idx++; } // 再处理加减法 int res = nums.get(0); idx = 0; while (idx < op.size()) { char c = op.get(idx); if (c == '+') res += nums.get(idx + 1); if (c == '-') res -= nums.get(idx + 1); idx++; } return res; }}
使用栈思想解决的一个经典问题,但是感觉代码有点冗长。。。
转载地址:http://xaesi.baihongyu.com/