美文网首页
计算器(一)——加减和括号

计算器(一)——加减和括号

作者: 旺叔叔 | 来源:发表于2018-11-01 18:05 被阅读0次

LeetCode_224_BasicCalculator

题目分析:

只有加减法,所以运算符之间是没有优先级的,只需解决括号带来的优先级问题。
可以有两个方案:递归,栈。

解法一:递归

/**
 * 解题简语:
 * 递归也可以用来达到栈的功能 -- 后进先出,妙不可言
 * 但是平衡括号部分有重复遍历 慢
 */
public static int calculate(String s) {
    int res = 0, num = 0, sign = 1, n = s.length();
    for (int i = 0; i < n; ++i) {
        char c = s.charAt(i);
        if (c >= '0') {
            num = 10 * num + (c - '0');
        } else if (c == '(') {
            int j = i, cnt = 0;
            for (; i < n; ++i) {
                if (s.charAt(i) == '(') ++cnt;
                if (s.charAt(i) == ')') --cnt;
                if (cnt == 0) break;
            }
            num = calculate(s.substring(j + 1, i));
        }
        if (c == '+' || c == '-' || i == n - 1) {
            res += sign * num;
            num = 0;
            sign = (c == '+') ? 1 : -1;
        }
    }
    return res;
}

解法二:栈

/**
 * 解题简语:
 * 1.从左到右挨个计算 用一个res累计当前结果
 * 2.用一个sign来区分加减
 * 3.遇到"("将之前结果压栈
 *   遇到")"弹栈 -- 压栈时同时压入sign
 * PS:1.res = 0和 sign = 1 其实相当于是表达式前方加了个 "0+"
 *    2.
 *    '0' == 48
 *    '空格' == 32
 *    '+' == 43
 *    '-' == 45
 *    '*' == 42
 *    '/' == 47
 *    且题目只空格数字运算符
 *    所以 c >= '0' c就是数字字符
 */
public static int calculate(String s) {
    int res = 0, num = 0, sign = 1, n = s.length();
    Stack<Integer> st = new Stack<>();
    for (int i = 0; i < n; ++i) {
        char c = s.charAt(i);
        if (c >= '0') {
            num = 10 * num + (c - '0');
        } else if (c == '+' || c == '-') {
            res += sign * num;
            num = 0;
            sign = (c == '+') ? 1 : -1;
        } else if (c == '(') {
            st.push(res);
            st.push(sign);
            res = 0;
            sign = 1;
        } else if (c == ')') {
            res += sign * num;
            num = 0;
            res *= st.pop();
            res += st.pop();
        }
    }
    res += sign * num;
    return res;
}

相关文章

  • 计算器(一)——加减和括号

    LeetCode_224_BasicCalculator 题目分析: 解法一:递归 解法二:栈

  • 计算器(三)——加减和乘除和括号

    抱歉 772这题是付费题被锁了,所以就假装我们在做题好了。 题目分析:用递归或者栈来解决括号优先级问题,用栈或者变...

  • Python编程实现简易计算器

    我们这次实现的命令行计算器,支持加减乘除、括号、浮点数、负数,以及查看历史和退出功能。 主要的思路:read - ...

  • Nim早茶之使用栈实现计算器

    我们这次实现的命令行计算器,支持加减乘除、括号、浮点数、负数,以及查看历史和退出功能。 主要的思路:read - ...

  • c语言表达式求值

    1.问题描述 请写一个整数计算器,支持加减乘三种运算和括号。 2.源码实现 3.编译源码 4.运行及其结果

  • 224. Basic Calculator

    给定一个字符串,实现基本计算器计算结果。字符串中包含加、减、空格、括号 字符串除了数字与括号外,只有加减号,如果展...

  • LeetCode with Swift 基本计算器相关

    1 实现一个基础计算器, 没有括号: LeetCode 227 2 实现一个基础计算器, 有括号类型 收获1: ...

  • 【速算】加减混合式的运算

    1. 去括号和添括号的法则在只有加减运算的算式里,如果括号前面是“+”号,则不论去掉括号或添上括号,括号里面的运算...

  • 栅格计算器

    采用栅格计算器进行多个或( | )、和( & )的运算,一定要记得加括号!

  • JS基础——002

    1.运算符 算数运算符:+ - * / (加减乘除)%(取余)算数运算符先乘除后加减有小括号先算小括号...

网友评论

      本文标题:计算器(一)——加减和括号

      本文链接:https://www.haomeiwen.com/subject/cmoxxqtx.html